本来CF Round427就已经有1865rating了,当时扬言要一战上紫,结果后面两场CF一场-5,一场+2,直到现在才达成目标,可惜暑假结束前或许不再有div1的round了。
这场cf时常2.5小时(然而前108分钟拿到了所有分数)。
开场看A题,以为hack点很多(flag*1,后来发现是真的),过了5分钟才AC,然后15分钟时切了B题,30分钟时切了C题,一看standing,还在200名开外,这样子怎么上紫啊?
点开D题,似乎是道交互题,接着我在UOJ群里看到“随机”二字,所以这题可以随机查询1000个位置,然后暴力?
从洛谷那道卡常RMQ拉来随机数板子,自信不会被卡(flag*2,后来很多人在奇怪的testWA了,突然很庆幸),开场66分钟交了一发, 居然Idleness limit exceeded on pretest 1?这是什么奇技淫巧?折腾了16分钟才知道每次I/O后都要fflush(stdout)
,然后WA了,把种子改成time(0)+5
,随机次数改成900次,还是WA,眼调发现好像是没有判等于,改完就过了pre tests。
一看榜,刚好rank50,这下应该能上紫了吧(flag*3)
好像E题还无人AC,估计没可做。
好像AB题hack点很多,去刷hack算了。
我们房间里好像已经有人在A题刷了7个hack,看了几个估计没有还能hack的了(flag*4,7个hack刷过后A题还有两人FST)
然后就锁了B题,突然发现有个小哥是用组合数实现的,而且封装在一个返回值为int的函数里,造了50*50个1就hack掉了(然而vfk的博客里不是说没开long long要在pt里就显示出来吗?)。
过来会儿B题又多了几个hack,去试试C题吧。
发现C题什么奇怪的写法都有,还有用并查集的,然而叉不掉。
去UOJ群里问”div2C有什么hack点”,有个大佬私信我
2017/8/25 2:50:12
你认为哪里有?
2:51:35
2017/8/25 2:51:35
我也不知道,还没找到
2017/8/25 2:52:14
你没想好就看代码……
2017/8/25 2:52:18
搞什么飞机
2017/8/25 2:52:24
这不是裸的置换群吗
2017/8/25 2:52:28
有什么可以cha的
就这么裱了我一通。
最后3分钟有个人绝杀E题,真是exciting。
仔细回想了这场CF,似乎解锁了两个成就:1.AC一道交互题;2.在CF赛场上成功hack
顺便解说一下div2E的标算:
把原树的重心(可能在边上)找出来,然后努力把被重心(或重心所在边的两端点)分开的子树变成菊花,具体操作见代码。
#include<cstdio>
const int N=200005;
struct edge{
int to,next;
}e[N<<1];
int h[N],n,xb,a,b,i,j,rt,rt2,sz[N],f[N],dfn[N],x[N<<1],y[N<<1],z[N<<1],k,dad[N],lst;
inline void addedge(int a,int b){
e[++xb]=(edge){b,h[a]};
h[a]=xb;
e[++xb]=(edge){a,h[b]};
h[b]=xb;
}
inline void up(int&a,int b){
if(a<b)a=b;
}
void dfs(int x,int fa){
sz[x]=f[x]=1;
for(int i=h[x];i;i=e[i].next)if(e[i].to!=fa)dfs(e[i].to,x),sz[x]+=sz[e[i].to],up(f[x],sz[e[i].to]);
up(f[x],n-sz[x]);
if(f[x]<b)rt=x,rt2=0,b=f[x];
else if(f[x]==b)rt2=x;
}
void getv(int x,int fa){
if(fa!=e[i].to && x!=e[i].to)dfn[++xb]=x,dad[xb]=fa;
for(int j=h[x];j;j=e[j].next)if(e[j].to!=fa)getv(e[j].to,x);
}
int main(){
scanf("%d",&n);
for(i=1;i<n;++i){
scanf("%d%d",&a,&b);
addedge(a,b);
}
b=1<<30;
dfs(1,0);
for(i=h[rt];i;i=e[i].next)
if(e[i].to!=rt2){
xb=0;
getv(lst=e[i].to,rt);
for(j=1;j<=xb;++j){
x[++k]=rt,y[k]=lst,z[k]=dfn[j];
x[++k]=dfn[j],y[k]=dad[j],z[k]=e[i].to;
lst=dfn[j];
}
x[++k]=rt,y[k]=lst,z[k]=e[i].to;
}
if(rt2)for(i=h[rt2];i;i=e[i].next)
if(e[i].to!=rt){
xb=0;
getv(lst=e[i].to,rt2);
for(j=1;j<=xb;++j){
x[++k]=rt2,y[k]=lst,z[k]=dfn[j];
x[++k]=dfn[j],y[k]=dad[j],z[k]=e[i].to;
lst=dfn[j];
}
x[++k]=rt2,y[k]=lst,z[k]=e[i].to;
}
printf("%d\n",k);
for(i=1;i<=k;++i)printf("%d %d %d\n",x[i],y[i],z[i]);
return 0;
}