WC2021游记
这是我第一次也是最后一次参加 WC 了。突然发现这句话适用于我之后要打的所有比赛,唉大龄选手的悲哀
《关于我以为我要打铁结果不知道为啥 Ag 了这件事》
Day -30
和外省强校的 OIer 交流了一下才发现自己啥都不会,于是分别花了一周补树论、网络流、莫反。好家伙,一个月过去还是啥都不会,自闭了,深深明白自己的弱小。
Day -7
发现自己还不太会用 Linux,于是在虚拟机上装了个NOI Linux试图学习,结果发现难用的要死,火狐版本太老连你谷都登不上去。于是进行了在虚拟机写程序用QQ邮箱发给自己再用 Windows 交题的迷惑行为。
Day 1~4
每天重复着试图听课
机房巨佬们都在写牛逼计数题,而我连双指针都写不对,要被单调队列弹掉了/kk
考试前一天晚上试图整理自己还有啥并不会,准备打打板。好家伙整理出 70k+ 代码,得出结论自己啥都不会。放弃挣扎。
(此部分为下文的 WC 考场上啥都不会做了铺垫)
Day5
上午考试。一开题,感觉这次的题好 CF 呀(后来发现竟真有原题)。T1 没看懂题,T2 不会,T3 不会,好的我们重头再来一遍。
T1 感觉有点像前段时间考过的模拟赛题,也许可以用类似的方法骗分,打算重点做。
T2 暴力分好多!分析了五分钟发现不会处理问号,于是半个小时写了无问号的
T3 数学题!作为数学菜鸡的我当然是不会做的,看了一下大样例发现输出的答案只要不是
回过头来看 T1 ,不太明白 合法的括号序列 的定义,纠结了一个小时不同种类的括号能不能等价看待,即类似
定了定神,突然发现如果不同种类的括号能等价看待那分种类还有什么意义,好,前一个小时前的我是伞兵。
回顾了一下传统合法括号序列的定义:(感谢[CSP-S2019] 括号树救我狗命)
()是合法括号串。如果
A是合法括号串,则(A)是合法括号串。如果
A,B是合法括号串,则AB是合法括号串。
得到了一个基本的思路:先按第一条枚举三元环,再按第三条把互相能到点用并查集合并一下,然后按第二条尽量扩展。可以像 spfa 一样用队列维护一下哪些点可能更新别的点,多少能减点复杂度吧。
(在这里感谢 _sys 巨佬的模拟赛题给了我做这道题的几乎全部思路)
码码码,码到一半发现不能用 C++11,改改改,一个小时写完,调了十几分钟就过了前两个样例。让我震惊的是玄学复杂度居然过了第三样例,还跑得飞快!又测了下第四个样例,好家伙,跑了十几秒后 WA 了!改了个伞兵错误后离答案更近了一点,但是还不对。我又开始慌了。然而我并不知道应该怎么改我的玄学代码,发了会儿呆,测了测没有 CE 就交了。
考完发现全机房都会 T2 70分做法只有我不会,晚上水 U 群的时候又看见 EI 说 T3 要循环到
期望得分:
如果有巨佬愿意帮菜鸡我算算我 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 了!鬼知道我为什么会反向挂分啊!!!
晚上测了测,得分是
写在后面的话
暂且当作获奖感言吧,虽然这个奖没啥用且运气成分>实力成分,但它确实给我打了一剂强心剂。从 CSP2020 T1码了三个小时还爆零了开始,到 NOIP2020 全机房只有我一个人没省一,我真的想过很多很多次要不要退役(要不是我是女生估计早被教练劝退役了)。那段日子真的很压抑,似乎刷多少题、付出多少努力都没有用,这是我在学文化课时从未体会过的。毕竟我文化课成绩远比 OI 好,而且我理解能力强思维能力差确实不适合搞竞赛。一年半前刚学 OI 的时候我也只想混个省一没想停课(没想到自己菜得连省一都拿不到)。也许是叛逆心作祟,也许是向往停课的自由,又也许是因为 OI 真的远比我想象的有趣,专注于一件事情的感觉真的很棒,在机房的日子确实太快乐,我坚持走到了现在。
一切都是最好的安排,一切都是值得的。感谢CCF脚造数据让我坚定了走下去的决心,开始相信努力会有回报,也许并不丰厚,但一定会有,哪怕只是给你好运。足够了,哪怕 NOI 打铁或者干脆去不了,我也感谢这一年的时光,快乐而充实。就当是给自己放了一年假吧。
PS:OI 选手的男女比例简直可怕啊,我排名