反正 PKUSC 也就图一乐,就当去北京旅游一下。
Day 0
上午坐高铁去北京。下午在颐和园玩。晚上摆 generals。
Day 1
上午开营仪式,试机,试机题是 PKUSC2021 D1T1,难蚌。
下午去机房发现试机座位就是正式比赛座位,电脑还没还原。
13:00 开题。T1 字符串,T2 期望,T3 概率。
发现 T1 border 较难处理,转成周期,发现最多只能存在一个错误的位置。于是直接枚举周期长度,二分 lcp 找到这个位置,调和级数暴力枚举这些位置,再乱哈希判断一下就好了,感觉有一些细节,然后因为我的写法比较抽象还要写并查集区间覆盖。
写完交上去是 0 分,发现二分 lcp 写挂了,改了一下,AC。这时大概是 14:20。
T3 的前 12 分直接暴力,分析一下发现 20 分的随机数据中,树的深度和节点的孩子个数都是 \(O(\log n)\) 的,每次重新 DP 链上部分的复杂度是对的。
T2 一开始感觉完全不会,后来发现 \(n \le 20\) 直接状压,状态设为除了九条可怜外每个人是否可能是狼人,发现只可能向子集转移,甚至不需要高斯消元,直接写就行。
15:30 左右写完 T3 和 T2 的部分分。之后坐牢一个半小时,一分没多。
最后几分钟写了个名为 putrotten.cpp
的程序,输出 Good Game. wan yuan shen wan de.
。
Day 1 总分:\(100 + 23 + 32 = 155\)。
明天 80 分万岁!
赛后听说 T1 \(O(n^2)\) 过了?!
晚上继续摆 generals。
Day 2
上午讲座,主要介绍北大的课程方案。与我无关。
下午发现机位还是没变,电脑还是没还原。典中典。
开题,T1 数据结构,T2 最优化(背景是原神),T3 数论。
首先转化 T1 的问题。发现 2 操作会改变后续操作,且 1 操作只关心编号。发现可以转化为树形结构,1 操作就是给出每个点的父节点,2 操作就是子树移位,3 操作就是询问一个点在树的 dfs 序中的位置。
先口胡了一下部分分,65 分好像都会做,对于“80 分万岁”的目标应该已经够了,但是不过 T1 打锤子,还是再想一下正解吧。
想到用 LCT 直接维护树结构,但是 LCT 已经忘了,而且 dfs 序也不会处理。如果直接用数据结构维护 dfs 序呢?那还需要维护子树大小,没法做。
于是想到用平衡树维护括号序,就不用维护子树大小。写完发现样例过不了。一看,while (q--)
和 New(i + q + 2)
,难蚌。平衡树上的 rank
和 sum
还写成了先序,乐。
然后交上去才 45 分,后面全 T 了。woc,有病吧,卡 fhq-treap 常数?把平衡树的数组改成结构体,居然就过了,最大点 673ms。这时是 14:46。
总分 235 的目标达成,可以开摆了。
原神题 T2 的 \(a_{i,j}, b_{i,j}\) 为整数且随机的部分分感觉可以直接随,写了个模拟退火,寄了几次之后过了第一个子任务。瞎调了下参,啥用没有。
然后发现可以 DP,对于每个 \(\sum a\) 求出最大的 \(\sum b\),可以过 35 分。写完发现寄了,怀疑是 \(A, B\) 太大导致的精度问题,改了一下判断方式,删了一个不知道有没有写挂的贪心,就过了 35 分。
推了一下子任务 4,发现要让 \(\sum a\) 尽量接近某个值,但是没想出怎么做。
看到 T3 的 \(x^i \bmod \lfloor \sqrt{x} \rfloor\),开摆。
摆了一会儿,发现对于第一个子任务,可以直接枚举 \(x \bmod \lfloor \sqrt{x} \rfloor\),解第一个同余方程,并代入检验即可。但比较卡常。交了好几次都是 TLE 0 分。然后加上一些 continue
,把 \([\sqrt{x}]\) 的二分范围改成 sqrt(x)
上下 10,就卡过去了。
最后 18 分钟当然是摆烂。继续运行昨天写的 putrotten.cpp
。这是 Day 1 考完唯一没删的程序。
Day 2 总分:\(100 + 35 + 15 = 150\)。
两天总分:\(155 + 150 = 305\)。
闲话
- 原神怎么 T5 出题人了。