WC2021游记

· · 生活·游记

这是我第一次也是最后一次参加 WC 了。突然发现这句话适用于我之后要打的所有比赛,唉大龄选手的悲哀

《关于我以为我要打铁结果不知道为啥 Ag 了这件事》

Day -30

和外省强校的 OIer 交流了一下才发现自己啥都不会,于是分别花了一周补树论、网络流、莫反。好家伙,一个月过去还是啥都不会,自闭了,深深明白自己的弱小。

Day -7

发现自己还不太会用 Linux,于是在虚拟机上装了个NOI Linux试图学习,结果发现难用的要死,火狐版本太老连你谷都登不上去。于是进行了在虚拟机写程序用QQ邮箱发给自己再用 Windows 交题的迷惑行为。

Day 1~4

每天重复着试图听课 \to 十分钟后掉线 \to 试图写一道题 \to 题太难写不动 \to 开始颓废的生活。晚上打保卫萝卜,卡关自闭/被防沉迷了就开始追沙雕狗血偶像剧。五天只写了十道题,练习分 -=4。引用一句自己 2021-02-03 22:37:46 发的犇犇:

机房巨佬们都在写牛逼计数题,而我连双指针都写不对,要被单调队列弹掉了/kk

考试前一天晚上试图整理自己还有啥并不会,准备打打板。好家伙整理出 70k+ 代码,得出结论自己啥都不会。放弃挣扎。

(此部分为下文的 WC 考场上啥都不会做了铺垫)

Day5

上午考试。一开题,感觉这次的题好 CF 呀(后来发现竟真有原题)。T1 没看懂题,T2 不会,T3 不会,好的我们重头再来一遍。

T1 感觉有点像前段时间考过的模拟赛题,也许可以用类似的方法骗分,打算重点做。

T2 暴力分好多!分析了五分钟发现不会处理问号,于是半个小时写了无问号的 O(n|E|) 50 分,爬了爬了。

T3 数学题!作为数学菜鸡的我当然是不会做的,看了一下大样例发现输出的答案只要不是 -1 就都 \le m 。于是就只循环到了 m

回过头来看 T1 ,不太明白 合法的括号序列 的定义,纠结了一个小时不同种类的括号能不能等价看待,即类似 ([)] 的串是不是合法。因为样例一不涉及这个问题,样例二又没解释,于是又手玩样例二花了一个小时,发现两种解释都能说通!我直接人傻了。这个时候只剩下两个小时了,我 T1 连题都没看懂,T2、T3 都只有最朴素的暴力,开始觉得要打铁了(没想到 70 也能 Cu),慌得一批。

定了定神,突然发现如果不同种类的括号能等价看待那分种类还有什么意义,好,前一个小时前的我是伞兵。

回顾了一下传统合法括号序列的定义:(感谢[CSP-S2019] 括号树救我狗命)

() 是合法括号串。

如果 A 是合法括号串,则 (A) 是合法括号串。

如果 AB 是合法括号串,则 AB 是合法括号串。

得到了一个基本的思路:先按第一条枚举三元环,再按第三条把互相能到点用并查集合并一下,然后按第二条尽量扩展。可以像 spfa 一样用队列维护一下哪些点可能更新别的点,多少能减点复杂度吧。

(在这里感谢 _sys 巨佬的模拟赛题给了我做这道题的几乎全部思路)

码码码,码到一半发现不能用 C++11,改改改,一个小时写完,调了十几分钟就过了前两个样例。让我震惊的是玄学复杂度居然过了第三样例,还跑得飞快!又测了下第四个样例,好家伙,跑了十几秒后 WA 了!改了个伞兵错误后离答案更近了一点,但是还不对。我又开始慌了。然而我并不知道应该怎么改我的玄学代码,发了会儿呆,测了测没有 CE 就交了。

考完发现全机房都会 T2 70分做法只有我不会,晚上水 U 群的时候又看见 EI 说 T3 要循环到 6m ,觉得自己要打铁了。只能寄希望于 CCF 脚造数据让我 T1 多过点。

期望得分:0\sim64+50+0\sim20=50\sim134

如果有巨佬愿意帮菜鸡我算算我 T1 代码的复杂度,或者看看为什么正确性假了,我将感激不尽!附上代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace FGF
{
    int n,m,K;
    const int N=3e5+5,M=6e5+5;
    ll read()
    {
        ll s=0,w=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')w=-w;ch=getchar();}
        while(isdigit(ch))s=s*10+ch-'0',ch=getchar();
        return s*w;
    }
    struct edg{
        int to,nxt,w,op;
    }e[M<<1];
    int cnt,head[N],ans;
    void add(int u,int v,int op,int w)
    {
        cnt++;
        e[cnt].to=v;
        e[cnt].nxt=head[u];
        head[u]=cnt;
        e[cnt].op=op,e[cnt].w=w;
    }
    vector<int> g[N];
    int fa[N],vis[N];
    queue<int> q;
    int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
    void merge(int u,int v)
    {
        if(u==v)return;
        if(!vis[u])q.push(u);
        if(!vis[v])q.push(v);
        vis[u]=vis[v]=1;
        u=find(u),v=find(v);
        if(u!=v)
        {   
            if(g[u].size()>g[v].size())swap(u,v);
            fa[u]=v;
            for(int i=0;i<(int)g[u].size();i++)
                g[v].push_back(g[u][i]);
        }
    }
    void work()
    {
        n=read(),m=read(),K=read();
        for(int i=1,u,v,w;i<=m;i++)
        {
            u=read(),v=read(),w=read();
            add(u,v,w,1),add(v,u,w,-1);
        }
        for(int i=1;i<=n;i++)fa[i]=i,g[i].push_back(i);
        for(int u=1;u<=n;u++)
            for(int i=head[u];i;i=e[i].nxt)
                if(e[i].w==1)
                {
                    int v=e[i].to;
                    for(int j=head[v];j;j=e[j].nxt)
                        if(e[i].op==e[j].op&&e[j].w==-1&&e[j].to!=u)merge(e[j].to,u);
                }
        while(q.size())
        {
            int u=q.front(),f=find(u);
            q.pop();vis[u]=0;
            for(int i=head[u];i;i=e[i].nxt)
                if(e[i].w==-1&&find(e[i].to)!=f)
                {
                    for(int j=0;j<(int)g[f].size();j++)
                        if(g[f][j]!=u)
                        for(int k=head[g[f][j]];k;k=e[k].nxt)
                            if(e[i].op==e[k].op&&e[k].w==-1)
                                merge(e[i].to,e[k].to);
                }
        }
        for(int i=1;i<=n;i++)
            if(find(i)==i)ans+=1ll*g[i].size()*(g[i].size()-1)/2;
        printf("%d\n",ans);
        ans=0;
    }
}
int main()
{
    freopen("bracket.in","r",stdin);
    freopen("bracket.out","w",stdout);
    FGF::work();
    return 0;
}

Day6

早上听国家队答辩,巨佬们语速太快,我还没完全上线就掉线了,只记住了有两个大神是双国集和评委问的一些奇葩问题。还想了想自己如果遇到这些问题应该怎么答,想不出来,后来觉得反正也没机会被问就没再想了。

下午完全无心写题,开始明白去年 WC 时学长们念叨了一下午的“心情简单”。念到 134 分的时候我还没被念,此时全机房除了一个肯定 Au 的巨佬都有牌了,我慌的一批,觉得自己真要打铁了,毕竟我的得分下界可是 50/kk 。

得分出来了,居然 153 Ag 了!鬼知道我为什么会反向挂分啊!!!

晚上测了测,得分是 68+65+20,CCF 数据脚造的实锤了。O(n^2)5\times10^4 就离谱。

写在后面的话

暂且当作获奖感言吧,虽然这个奖没啥用且运气成分>实力成分,但它确实给我打了一剂强心剂。从 CSP2020 T1码了三个小时还爆零了开始,到 NOIP2020 全机房只有我一个人没省一,我真的想过很多很多次要不要退役(要不是我是女生估计早被教练劝退役了)。那段日子真的很压抑,似乎刷多少题、付出多少努力都没有用,这是我在学文化课时从未体会过的。毕竟我文化课成绩远比 OI 好,而且我理解能力强思维能力差确实不适合搞竞赛。一年半前刚学 OI 的时候我也只想混个省一没想停课(没想到自己菜得连省一都拿不到)。也许是叛逆心作祟,也许是向往停课的自由,又也许是因为 OI 真的远比我想象的有趣,专注于一件事情的感觉真的很棒,在机房的日子确实太快乐,我坚持走到了现在。

一切都是最好的安排,一切都是值得的。感谢CCF脚造数据让我坚定了走下去的决心,开始相信努力会有回报,也许并不丰厚,但一定会有,哪怕只是给你好运。足够了,哪怕 NOI 打铁或者干脆去不了,我也感谢这一年的时光,快乐而充实。就当是给自己放了一年假吧。

PS:OI 选手的男女比例简直可怕啊,我排名 160+,前面居然只有 3 个女生;所有拿牌的 800+ 名选手中女生也只有 20+。这都 40:1 了呀,数竞物竞都没这样吧!可爱的女孩子们为什么都不来学 OI 呀 QAQ。。。