CSP2019游记

Posted by wyj on November 16, 2019

前言

这是我第一篇在2o181o28.github.io上写的游记。使用gedit+git插件编辑。

Day0

上午疯狂颓废,晚上也在颓废。今天的运气好得很,局局通关。

Day1

宾馆早餐的质量让我很不满意,或许是因为我本来就没有食欲。

一进机房,发现大家都有readme.pdf,就我没有,然后举手问监考,说是我网线都没接。然后接上网线,问题就解决了。

我一直很好奇这种远程自动收发文件是怎么办到的。之前我没有足够的能力了解,我现在也没有。22端口开着,然而貌似ssh不允许密码连接。/etc/ssh/sshd_config中,写明了root登录无需密码。查看history,却发现把id_rsa都给删掉了。那么发题人到底是使用什么方式连接的ssh,我无法想象。

写完gedit配置,bashrc,inputrc之后就发题了。一看T1,最开始我其实是懵逼的,写了一个\(O(\log K)\)的暴力。然后我回想起了曾经看过的维基百科,才写了如下代码:

std::cin>>n>>k;
for(k^=k/2;n;)putchar(k>>--n&1|48);

最短代码绝对就是我了。于是把这两个代码对拍了一下,觉得很稳。

然后开T2,这道题给我一个直觉:树上SAM?然后仔细一看发现是道sb题,我懒得回退栈,也懒得倍增,直接一个线段树上区间内二分,简单暴力的解决了问题。此时才过去45min。大样例过了,懒得对拍。满数据不开O2虚拟机内0.4s。

当时我想,这怕不是和去年一样的三道sb题,全场AK。然而T3瞬间让我心态炸裂:怎么又TM是树上的贪心题?我顿时就慌了。我花了一个小时想出来一个假算法,却发现它连一条链都过不去。又花一小时修了锅,却又叉掉了新的做法。然后生无可恋去看菊花,想了想发现这个更加不可做。我环顾四周,欣慰的发现暂时没有人三个对拍在桌面上跑。然而我还是虚的要命,这TM还不如去年呢,又要被全场吊锤,退役了啊。赶紧码个暴力。

自闭到考试结束。这次机位和去年一样几乎不用排队,所以很快就能出去和别人py。首先是高一的大佬srf,他自称他也是210。我心里舒服多了。然后下楼一问,所有人都是210。好吧,那和去年也没有本质区别。一个虚假的snz号称自己200,却很快被无情的测试数据揭露出他250的事实。

整个下午都在搭建我的github pages。这个真的比使用洛谷博客烦多了,我还对html、yaml一窍不通。跟着网上的教程照猫画虎。

Day2

今天网络没出问题。看过去三道题,T1一眼就知道是容斥,当时我以为我随便就能切掉。然后T2,这DP优化也是很套路,然而数据范围4e7是什么鬼。连88分都要高精?顿时觉得不可做,直接看T3去了。怎么又是树的重心?要求的答案是直接\(\sum\)起来,而不是通常的异或\(\times\)编号。这给人一股考虑贡献的感觉。

所以我首先想了下T3,对于一个点考虑割哪些边能够让他成为重心。肯定是要分四种情况讨论的:祖先、轻子树、重儿子、其他点。每种情况毛想想都是对siz的一个上限+一个下限,用某种数据结构维护即可。

顺序开题,T1仔细看了看数据范围,却发现我不会了:我只会\(O(n^3m)\),肯定是过不了的,然而得分相当可观。由于今天我三题都很有思路,选择了码暴力的策略。于是84分轻松到手。

这时候恰好考场里发了个通知:T2的前88分保证答案不超过4e18。我心里长出了一口气,开始思考一个带log做法。然而发现我只会三方dp,实在是太菜了。于是我开始对着样例猜结论,可惜猜的结论都是假的,除了决策单调性貌似是成立的。然而三方dp怎么可能决策单调性呢?于是我人有多大胆地有多大产,做出了如下的猜想:

令\(p_i\)为前\(i\)个数的最优决策点,\(j\)的最优决策点又是\(i\),那么在\(j\)的最优方案中,\(i\)之前的分割点仍然是\(p_i\)。

如果这个成立,那么我根据\(i\)的最优决策,就可以直接维护决策单调性的数组。然后我试着码了一发:这是我人生的第二个决策单调性程序,上一个是诗人小G。

一测大样例,直接过了。心里很爽,就懒得对拍了。

此时是10点,我觉得两个小时码T3还是绰绰有余的。于是开始分类讨论T3的式子。分类完了发现与我想的一模一样,就是一个二维数点。这时一看旁边的老哥,

struct treepow{
	//树剖代码...
}

这命名方式是真的nb。然而我不想树剖,于是就开始考虑dfs序。我要维护的是“除根到x点的链及x子树之外的所有点siz”,根据之前看过的某道洛谷题,这可以直接使用后序遍历数组维护。然而我懒得了,就直接维护一个dfs序、一个从父亲继承这两个主席树,算答案的时候稍微加加减减一下就完了。

快11点的时候码完了。一测样例就段错误,调试15分钟,彻底自闭了。最后发现我写的是

void qry(){
	...	
}
void qry1(){
	if(l<=mid)ans=qry(...);
	if(r>mid)ans+=qry(...);
}

常见错误了。然后马上过了大样例。可惜满数据不开O2要2.3s,所以我稍微卡了卡常。

我忽然想起来了诗人小G那个题的变态溢出,然后发现T2我的中间结果真的有可能会爆。于是稍微修补了一下代码,心里慌得要命,觉得再怎么防范还是很容易溢出。

理论得分\(84+88+100=272\),然而后两题FST的可能性太大了。

出考场首先见到srf,他T1切了。等了半天也只见到xyx,不用说都知道他AK了。又被踩了。