CF AIM Tech Round 4上紫记

本来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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值