Bootstrap

ZJOI 2022 游记--zhengjun

前言

ZJOI 王朝复辟???。。。

这次比赛在 5 月 3 号和 4 号,由于 qz 教育局什么五一不调休,正常放完双休回来,刚好比赛的两天就是周二周三,还做好了回来隔离半个月的心理准备,这两天算不了什么。

day0

比赛前一天下午 1 点半出发,坐的小(mian)巴(bao)车(che),虽然只坐了 2h 不到,但是腰被安全带勒得酸麻了(这个安全带拉开后只能收紧不能放松,差评!),然后车程刚好可以让我和 fls 看一部电影,选了忍者神龟,很快就到了 yw,先到了酒店放下东西,然后立刻去 ywzx 试机。

到了试机的地方,就先检查了键盘每个键都是好用的,然后随手写了个 A+B Problem,感觉键盘蛮不错的(至少比 qzez 的键盘好),然后考虑了一下赛时用什么软件,顺便看到了 FLY 也时监考老师 /se,就把 FLY 辛辛苦苦找来的 Windows 版本的 g++ 9.3.0 贺过来了(我之前也找过,没找到,这波血赚),最后看到其他人都是直接 FFT 或者其他的大数据结构来练手,我感觉我 A+B 就有点寒掺了。

回到酒店,晚饭有亿点点辣,再加上有点热,说不出来是咬到舌头了还是辣和热的痛觉,吃不下去了,去其他同学房间想蹭个不辣的菜,结果不是菜更辣就是吃完了,于是就先看了会手机准备凉下再吃。

晚上也就和 fls 放松了一下,愉快的睡了(虽然开始有点热,起来调了下空调,但还是睡得蛮舒服的)。

day1

早上六点半起来,下楼吃早餐,早餐很好,吃得很舒服。

然后就去了 ywzx 的四楼机房,依旧是 FLY 和其他几个老师在监考,这个压缩包的密码确实厉害,ZJ0l,还是老师手写的,0 和 O、I 和 l 分不清,直到老师打在大屏幕上才解压出来,服了服了。

开题直接开幕雷击,一看到三道 1024MB,时限分别是 2s、4s、5s,无语了,所有出题人全不是不怀好意的啊,心心念念的送分题没了 /ll。

开 T1,什么奇葩计数题,想了 20 m i n 20min 20min 只想到 O ( n × 2 n ) O(n\times 2^n) O(n×2n) 的暴力,只有 20 p t s 20pts 20pts,算了算了,差不多得了。

然后开 T2,觉得这是一道什么脑洞题,发现可以拿 40 p t s 40pts 40pts,毫不犹豫,我才不想正解呢(其实是我想不出来罢了)!直接开始写暴力。

此时过了 2h,开 T3,发现这道题的特殊性质是一点不懂,然后又半毛钱也没有推出来,自己只会一棵树的分,TMD 怎么只有 10 p t s 10pts 10pts,哎, 10 10 10 分也是分,打了再说。

打完 T3 暴力的时候还剩下 2 h 2h 2h,觉得 T1 好像应该可以搞个多项式复杂度的算法,可能可以拿更多的分,然后就设了 f i , j , k , l , g f_{i,j,k,l,g} fi,j,k,l,g 表示 i i i 个节点,在第一棵树中有 j j j 个叶子节点和 k k k 个还没有连接儿子的非叶子节点,在第二棵树中没有连接父亲节点的叶子节点有 l l l 个、非叶子节点有 g g g 个,然后转移是 O ( n 2 ) O(n^2) O(n2) 的,所以总复杂度是 O ( n 7 ) O(n^7) O(n7),傻眼了,不仅要滚动数组,而且一分没有。

但是还是先打出来准备待会优化,然后发现可以排除一些无用状态,这样本地开 O2 可以跑到 n = 40 n=40 n=40 的点,结果看了看,什么鬼东西,出题人什么丧心病狂的魔鬼,还是 20 p t s 20pts 20pts,结果优化来优化去,想着前缀和优化转移,结果发现还有个组合数在哪里搞不掉,索性开始卡常(因为 n = 50 n=50 n=50 的点要跑 8 s 8s 8s,甚至想去用 python 打表,可是想想时间不多了,等会 python 不会调试,直接放弃)。

结果卡了半天的常数还是只能过 n = 40 n=40 n=40 的点,弃了弃了,现在离结束只有 1h 了,所以直接再看看 T3,突然发现还有个简化版的仙人掌是可以用 tarjan 缩点然后 LCA+差分的,于是花了 30min 写完调完走人了。

再也不想见到 T1 这种**的题目了,20min 可以得 20 p t s 20pts 20pts 2 h 2h 2h 甚至也可以得 20 p t s 20pts 20pts,如此 liang 心的出题人,难得难得。

考完之后还要写一坨什么 md5 加密的东西,真无语。

顺带提一句,考试的时候肚子有点不舒服,说不上很痛,但是就很难受,真是老天都不想让我考好。

下午回到酒店,洗洗衣物,做好再多呆 3 天的准备,然后水了水群消息,吐槽了一下 FJOI,然后和 fls 玩脑力游戏,不过有些东西确实挺妙的。

最后晚饭比昨天好多了,至少没有特别辣,但我还是等到了完全凉了吃几口缓一缓,直到 9 点才吃完,之间从七八点开始和 fls 打篮球,蛮有趣的。

差不多也就洗洗睡了。

day2

早上 6:40 老叶突然发消息让我们收拾好东西,下午就要回 qz 了,除了艹字没话讲。

到了考场这个密码很好,什么 Cc!FN0I,特派员挺会想密码的。

比赛开始先开 T1,暴力竟然有 10 p t s 10pts 10pts,这么liang心,然后先花了十分钟写完了暴力,以为无论 n n n 是多少,最后都会变成全部一样的,结果发现样例直接一个反例,然后看到了 n = 2 k n=2^k n=2k 的点,好像这个就是会变成一样的了,于是暴力改了几个字符,多了 5 p t s 5pts 5pts

接着开了 T2,发现对于我这种低人亿等的代码能力十分难打出来,于是打了个暴力中的暴力,就是先处理出所有符合条件的点,然后把相邻的点两两连边,然后直接 dfs 枚举每个点是否要选,加一些剪枝,结果只能跑过去 a , b , c ≤ 2 a,b,c\le2 a,b,c2 的点,甚至没有半分。

然后想了想 a ≤ 3 a\le3 a3 的点好像可以状压 dp,然后状态一设,转移方程式一列,发现转移是 O ( 2 2 × ( 4 × a − 1 ) ) O(2^{2\times(4\times a-1)}) O(22×(4×a1)) 的(后来想想发现其实有很多转移都是不合法的,是不是合法的转移个数很少呢?也许吧),直接爆炸,然后开着暴力让暴力慢慢跑。

接着开了 T3,然后尝试推了一下期望,但是有个什么 sb 的最小值的期望,我还不能用最小值的期望与另一个最小值的期望进行转移,做屁啊,直接看部分分。看到有菊花图,想了想,不会,又看到有一条链,这我会了!期望等于没有,直接单调栈就完事了,花了 30 m i n 30min 30min 打完之后,发现样例的第二个数据怎么都过不了,想了想,发现如果 r o o t root root 不在链的两端的话,就会在两边把 f ( r o o t , r o o t ) f(root,root) f(root,root) 都算一遍,于是减掉就好了,随便手捏了两组小数据,看看没啥问题,走人,什么万一哪里没有取模爆掉了我也不管了,反正已经炸了,这 5 p t s 5pts 5pts 不算什么。

此时离考试结束仍有 2 h 2h 2h,回去干 T1,准备写个矩阵乘法可以得 5 p t s 5pts 5pts,可惜当时没有想到可以预处理出这个矩阵的 2 i 2^i 2i 的幂是多少,然后用初始向量去乘一下,就能把复杂度从 O ( n 3 × q × log ⁡ k ) O(n^3\times q\times\log k) O(n3×q×logk) 降到 O ( n 2 × q × log ⁡ k ) O(n^2\times q\times \log k) O(n2×q×logk),就有 30 p t s 30pts 30pts 了。可是这些只是考后才发现的。当时我就推了一下,发现其实没有必要开 n × n n\times n n×n 的矩阵,完全可以考虑一下把 n n n 拆分成 2 x × y + 2 x − 1 2^x\times y+2^{x-1} 2x×y+2x1 的形式,就是前面一坨都是 2 x 2^x 2x 个连续一样的,最后落下一个 2 x − 1 2^{x-1} 2x1 个,然后不管拉多少次面,仍然是这种形式,于是我就优化了一下刚刚的矩阵乘法,可以过 ∑ n ≤ 150 \sum n\le150 n150 的点,但是 ∑ n ≤ 500 \sum n\le500 n500 的点我可以把我卡到 25 s 25s 25s,但是有可能造数据的人不会想我一样直接一组数据 n = 498 n=498 n=498,把我的矩阵大小卡到最大,说不定能骗几分。

花了 50 m i n 50min 50min 写完之后,看到了还有 n = 98304 n=98304 n=98304 的点,分解了一下质因数,发现用我刚刚的方法,矩阵大小就是 2 2 2,然后就能过了,于是改了改,似乎又可以拿 5 p t s 5pts 5pts 了,结果随便捏了组数据,发现跑不出来,想了半天知道了是因为我矩阵大小开太大了,导致跑的很慢,于是我就把我所有的矩阵都卡到最小使我的程序跑的快一点。

现在还有 30 m i n 30min 30min,我先查了一下我 T1 的每个部分分有没有写错,突然发现我的 ∑ n ≤ 50 , ∑ q ≤ 50 \sum n\le50,\sum q\le50 n50,q50 的最原始的矩阵乘法输出了个负数,我看呆了,每一步运算都转了 long long 并且取模过了,但就愣是输出负数(赛后 fls 帮我开打了一下矩阵里数组的大小然后就没输出负数了,我谔谔,难道开 51 51 51 不够吗),直到还剩下 5 m i n 5min 5min,心态炸了,不管了,直接把这个部分分注释掉,用下面的优化过的(赛后看看似乎没有输出负数,真是惊险)。

回去的时候和 fls 看了绝杀慕尼黑,这种篮球赛想想就是开始领先,然后最后一个失误使对手反超一分,留下来几秒钟时间绝杀掉去,虽然完美猜中结局情节,但是这部电影确实十分优秀,推荐一下。

后记

最终估分:
day1: 20 + 40 + 40 = 100 20+40+40=100 20+40+40=100
day2: 35 + 0 + 5 = 40 35+0+5=40 35+0+5=40
实际得分:
day1: 20 + 40 + 10 = 70 20+40+10=70 20+40+10=70
day2: 40 + 0 + 0 = 40 40+0+0=40 40+0+0=40

加上 NOIP 2021 自己走了狗屎运的 284 p t s 284pts 284pts(见 NOIP 2021 游记–zhengjun),如果 Day2 的标准分算初中生神犇 zky 的 140 p t s 140pts 140pts 的话,我的标准分是 440 440 440,如果不算的话,我是 450 450 450 分。(貌似离队线就差了 NOIP T3 的正解加上 NOIP T4 的暴力加上 Day1 T3 的环套树的部分分加上 Day2 T2 a ≤ 3 a\le3 a3 30 p t s 30pts 30pts 的部分分以及 Day2 T3 写挂了的那 5 p t s 5pts 5pts?)

分析:Day1T3 的环套树的部分分写挂了,fls 好像也挂了,直接没掉 30 p t s 30pts 30pts,Day2T1 的优化过的算法跑过了一个 ∑ n ≤ 500 \sum n\le500 n500 的点,可是 Day2T3 的 d e g deg deg 数组没有清空,导致在链的部分分中只有第一组数据输出正确的答案,其余的都输出 0 0 0。/ll

目标:不垫底,考到 fls 总分的 30 % 30\% 30%,优势在我,椰树牌椰汁保佑我!

希望明天我正式参加省选的时候不要 ZJOI 了啊啊啊啊啊啊,我要打联合省选!

总结一下这两天,当了 9 h 9h 9h 的暴力人,从来没有考虑过正解,还好没有这么做,遗憾的是 FLY 还是很忙,没有找机会把 fls 的 lg 本子要来,或许可以让 FLY 出钱从 yw 邮寄到 qz。(((

最好来个什么 NOIP 标准分 400,day1 标准分 300,day2 标准分 300,反正我已经寄了,这样就可以让我和 fls 的分差稍微少亿点点了。/kk

但愿明年省选能良心一点吧。

;