2019.03.16 ZJOI2019模拟赛 解题报告
得分: \(100+27+20=147\)(\(T1\)巨水,\(T2,T3\)只能写暴力分)
\(T1\):深邃
比较套路的一眼题,显然是一个二分+贪心,感觉就是\(NOIP2018Day1T3\)弱化版。
我们可以考虑,对于两个祖先关系的关键点之间路径上的一个节点,我们如果选择了它,就必须选择它所有不含关键点的子树(显然,证明略)。
因此,我们便可以将一个关键点作为整棵树的根节点,然后对于每个节点,将其与它所有不含关键点的子树合并在一起,这样就方便操作了。
然后,易发现每个非关键点只可能与和它路径上不存在其他关键点的某一关键点被分在同一部分中。
而贪心的思想,每个点肯定尽量放到它子树中的某一关键点中(因为它的子节点能造成贡献的点集被它的祖先节点能造成贡献的点集包含)。
而对于要选择哪一个关键点,显然是选择还能放下的节点数最多,即当前节点数最少的。
但是要注意,在某一子树中,一旦选定了一个关键点,就不能再做修改了!
代码也是比较简单的:
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 200000
using namespace std;
int n,k,flag,a[N+5],p[N+5],u[N+5],sz[N+5],ns[N+5];
vector<int> v[N+5];
class Tree
{
private:
int ee;
public:
int lnk[N+5];struct edge {int to,nxt;}e[N<<1];
I void add(CI x,CI y) {e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y;}
}T,NT;
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}F;
I void dfs(CI x,CI lst,CI f)//第一遍DFS,预处理
{
for(RI i=(sz[x]=1,u[x]=p[x],T.lnk[x]);i;i=T.e[i].nxt)
{
if(!(T.e[i].to^lst)) continue;dfs(T.e[i].to,x,p[x]?x:f),
u[T.e[i].to]?(NT.add(x,T.e[i].to),u[x]=1):sz[x]+=sz[T.e[i].to];//对于每个节点,将其与它所有不含关键点的子树合并在一起
}
}
I int Check(CI x,CI val)//验证答案是否合法
{
RI i,t,s;for(v[x].clear(),ns[x]=sz[x],i=NT.lnk[x];i;i=NT.e[i].nxt)
{
if(t=Check(NT.e[i].to,val),!flag) return -1;//如果出现不合法情况,返回false
t&&(v[x].push_back(t),0),!p[NT.e[i].to]&&(ns[x]+=ns[NT.e[i].to]);//把关键点加入一个vector存储,如果遇到没被选择的非关键点,就将当前节点大小加上这个非关节点的大小
}
if(p[x]) return ns[x]>val&&(flag=0),x;if(!v[x].size()) return 0;//对于关键点,我们无法将它划入某一部分,因此直接判断它的大小是否大于val,然后退出;对于没有返回得到任何关键点的点,我们无需操作,直接退出
for(t=v[x][0],s=v[x].size(),i=1;i^s;++i) ns[v[x][i]]<ns[t]&&(t=v[x][i]);//找到这些节点中最小的节点
ns[t]+ns[x]<=val&&(ns[t]+=ns[x],ns[x]=0);return t;//若能合并则合并,并将其返回
}
int main()
{
freopen("deep.in","r",stdin),freopen("deep.out","w",stdout);
RI i,x,y,res,STO,hl,ORZ;for(F.read(n,k),i=1;i^n;++i) F.read(x,y),T.add(x,y),T.add(y,x);//读入,建树
for(i=1;i<=k;++i) F.read(a[i]),p[a[i]]=1;dfs(a[1],0,0),STO=1,ORZ=n;//读入,初始化
W(STO<=ORZ) flag=1,Check(a[1],hl=STO+ORZ>>1),flag?(res=hl,ORZ=hl-1):STO=hl+1;//二分答案
return printf("%d",res),0;//输出答案
}
\(T2\):黑暗
推\(DP\)式子推了很久没推出来,最后毅然交打表\(27\)分:(不会订正)
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 30000
#define X 998244353
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
#define Dec(x,y) ((x-=(y))<0&&(x+=X))
#define min(x,y) ((x)<(y)?(x):(y))
using namespace std;
int n,m;
class ListSolver//打表
{
private:
const int f[8][8]={{0},{0,1},{0,1,1},{0,4,3,1},{0,38,19,6,1},{0,728,230,55,10,1},{0,26704,5098,825,125,15,1},{0,1866256,207536,20818,2275,245,21,1}};
I int Qpow(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}//快速幂
public:
I int GetAns(CI x,CI y) {RI i,res=0;for(i=1;i<=x;++i) Inc(res,1LL*f[x][i]*Qpow(i,y)%X);return res;}//求答案
}L;
int main()
{
freopen("dark.in","r",stdin),freopen("dark.out","w",stdout);
RI Qtot,x,y;scanf("%d",&Qtot);W(Qtot--) scanf("%d%d",&x,&y),printf("%d\n",L.GetAns(x,y));//读入+输出
return 0;
}
\(T3\):幻想
直接\(KMP\)来\(O(n^2)\)大暴力。
正解是神仙般的后缀平衡树,懒得订正了。
2019.03.16 ZJOI2019模拟赛 解题报告的更多相关文章
- 2019.03.13 ZJOI2019模拟赛 解题报告
得分: \(55+12+10=77\)(\(T1\)误认为有可二分性,\(T2\)不小心把\(n\)开了\(char\),\(T3\)直接\(puts("0")\)水\(10\)分 ...
- 2019.03.19 ZJOI2019模拟赛 解题报告
得分: \(100+10+45=155\)(\(T1\)又是水题,\(T2\)写暴力,\(T3\)大力\(STL\)乱搞) \(T1\):哈夫曼树 首先,根据题目中给出的式子,可以发现,我们要求的其实 ...
- 2019.03.02 ZJOI2019模拟赛 解题报告
得分: \(10+0+40=50\)(\(T1\),\(T3\)只能写大暴力,\(T2\)压根不会) \(T1\):道路建造 应该是一道比较经典的容斥题,可惜比赛时没有看出来. 由于要求最后删一条边或 ...
- 2019.03.09 ZJOI2019模拟赛 解题报告
得分: \(20+0+40=60\)(\(T1\)大暴力,\(T2\)分类讨论写挂,\(T3\)分类讨论\(40\)分) \(T1\):天空碎片 一道神仙数学题,貌似需要两次使用中国剩余定理. 反正不 ...
- 2019.03.14 ZJOI2019模拟赛 解题报告
得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...
- 2019.03.15 ZJOI2019模拟赛 解题报告
得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 10.30 NFLS-NOIP模拟赛 解题报告
总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...
- 20201101gryz模拟赛解题报告
写在前面 2020rp++ 停课的第一场模拟赛 拿上一年的上一年的day1来考的, 结果得分期望220pts,实际135pts,rank3,太菜了 考着考着机房灯突然灭了,当时慌的一批 以为断电代码要 ...
随机推荐
- 使用 Moq 测试.NET Core 应用
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...
- Android Studio CMake 生成多个so
生成多个so案例 这里stringFromJNI和stringFromJNI11分别是调用one-lib和two-lib两个so package com.test.ndkmoreso; import ...
- WSGI学习系列Pecan
Pecan Introduce Pecan是一个轻量级的基于Python的Web框架, Pecan的目标并不是要成为一个“full stack”的框架, 因此Pecan本身不支持类似Session和D ...
- (转)AIX下修改用户最大进程数
AIX下修改用户最大进程数 原文:http://blog.csdn.net/feichideche/article/details/39498555 使用AIX时候,切换用户,发现进程一直挂起,查看用 ...
- Sublime_text 3 安装 Package Control
作者博文地址:https://www.cnblogs.com/liu-shuai/ 一.自动安装: 1.通过快捷键 ctrl+` 或者 View > Show Console 菜单打开控制台 2 ...
- MongoDB数据库常用操作
推荐文章 --- 一天精通MongoDB数据库 注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 1. 删除文档中的一个字段 db.<集合名>.u ...
- eclipse中使用自带的git提交项目
1.自带git插件进行配置我们的用户名和密码,即是自己github注册用户.windows--perferences--Team--Git--Configuration 2.eclipse生成SSH2 ...
- wampserver启动时图标不变绿的解决方法
有2种可能: 1.你安装wamp的时候安装路径中有中文,把路径全部改为英文. 2.其他软件占用了80端口号,解决方法是在服务中找微软的sql server或者其他服务,关掉服务后重启就行了.
- Hive总结
一.什么是Hive 1.Hive 由 Facebook 实现并开源 2.是基于 Hadoop 的一个数据仓库 3.可以将结构化的数据映射为一张数据库表 4.并提供 HQL(Hive SQL)查询功能 ...
- kafka存储机制以及offset
1.前言 一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一.下面将从Kafka文件存储机制和物理结构角度,分析Kafka是如何实现高效文件存储,及实际应用 ...