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,太菜了 考着考着机房灯突然灭了,当时慌的一批 以为断电代码要 ...
随机推荐
- 16-----BBS论坛
BBS论坛(十六) 16.登录功能完成 (1)front/forms.py class SigninForm(BaseForm): telephone = StringField(validators ...
- 3-----Scrapy框架的命令行详解
创建爬虫项目 scrapy startproject 项目名 例子如下: E:\crawler>scrapy startproject test1 New Scrapy project 'tes ...
- Angular JS ng-model对<select>标签无效的情况
使用场景一: <select ng-if="item.award_type==1" id="award{{$index+1}}" name="X ...
- Dev Express Report 学习总结(七)Dev Express Reports 常见知识点总结
1. CalculatedField中常见表达式: A. For percent: [ValA]* 100 / ([ValA]+[ ValB]); PS. Please remre ...
- Win10通过SSH与树莓派Raspbain系统互传文件
1.在Linux系统上安装ssh-server(由于Raspbain系统自带ssh-server,这个步骤可以省略) 查看ssh是否运行的命令: ps -ef | grep ssh 如果没有安装,则安 ...
- WebStorm 预览时把浏览器地址localhost 改成IP
最近在使用WebStorm时,预览网页时地址总是显示的 http://localhost:63342/... ,如果要调试其它设备感觉很不方法,此时肯定首先想到的亲爱的度娘,但是貌似没有真正很解决问题 ...
- Caused by: java.net.URISyntaxException: Relative path in absolute URI
<property> <name>hive.exec.scratchdir</name> <value>/tmp/hive</value> ...
- [OpenStack] [Liberty] Neutron单网卡桥接模式访问外网
环境配置: * Exsi一台 * Exsi创建的单网卡虚拟机一台 * Ubuntu 14LTS 64位操作系统 * OpenStack Liberty版本 * 使用Neutron网络而非Nova网络 ...
- 注册中心eureka
最近在忙一些其它的事情,两个城市来回跑还要办一些手续,挺费劲的,学习的事情也就耽误了一些,尽量赶吧. spring cloud为分布式的微服务架构提供了一站式的解决方案,eureka注册中心在spri ...
- JEECMS站群管理系统-- 标签的配置流程
以cms_content_list为例,首先,每一个标签的声明都是在jeecms-context.xml中进行的, <?xml version="1.0" encoding= ...