比赛反思集合
ARC141
本次比赛被 A 卡住了,卡了40min,然后没时间做C,本来上大分的场次竟然掉分了。
原因:当时我的想法是,对于 n 的每一个前缀,去不断复制,然后将 n 的前缀最后一位减去 1,当时我没处理某一位是 0 的情况,WA 了之后也没有去怀疑做法的正确性或者是分类讨论的缺漏,当时认为是一些奇奇怪怪的精度问题,在经历 30min 的连续 WA 之后,才意识到了这一点。
总结:做题时不能对自己的做法太过于自信,WA 多半是因为解法的漏洞,应该回归问题本身,重新分析一遍,并证明,或者尝试说服自己每一个步骤的正确性。
补题:也是顺利的将 CD 补出来了,E 题卡了我半天。我观察到 E 题的两个点是在矩阵的对角线和与对角线平行的线上,然后我就寻思着怎么用 ds 去维护这些线。但其实将纸张旋转 45°,就会发现可以将操作转换为,同行之间的操作和不同行之间的操作,多手玩几个就会发现一个很简单的规律,用并查集维护即可。
反思:对于题号靠后的题,不要想着这题一定会用一些奇奇怪怪的东西,有时候多换个角度思考,多画几个例子,真相自然就会浮出水面。
【Virtual】CF66
也是顺利 AK。
看了一下 rng 的代码,他的 C 题是将每一个 folder 的路径存在 vector 里面,然后排序,这样一个 folder 里面的东西都是连续的一段,可以二分去找这个 folder 中的最后一个。但是他在处理重复统计时没做好,而且没注意到 file 不能当做 folder,然后 fst 了。
他的 E 题是求出路程中最小值的位置,由于题目中 ai 之和 = bi 之和,所以直接判断当前的前缀和是否等于最小值就行了,比我写的线段树求最小值要简单。
【Virtual】CF65
做出A-D,C 挺恶心的。精度控制的不好就会错,精度高了会 T,低了会 WA,因此吃了 \(4\) 发罚时,由于 CF 对于 printf 的处理好像和本地不一样,也因此吃了 \(2\) 发罚时,最终 \(+7\)。
看了一下 rng 的解法,他的 C 写的是真简洁,将比较常用的函数,比如距离公式放函数里面,我做的时候想偷点懒就没放,最后写的更长更复杂,自己吃亏。之前喷过他小数二分判次数不判 \(r-l \ge \text{eps}\),今天我体会到了判次数的优点,就是它不会 T,大概估算一下复杂度最多能跑多少次就行,至于二分多少次或者是 eps 取多少,还有 CF 上因为系统不同而导致的奇奇怪怪的问题,还要多做题多积累,感觉上来了可能会顺利很多。
rng 的 D 题我搞不懂为什么要将四个参数定义成变量而不是定义成数组或者 vector,定义成 vector 的话,寻找最小值和判断最小值,循环就可以搞定,而定义成变量要写四遍,在复制的时候还可能因为忘记改哪个地方或者手滑改错而浪费时间。
【Virtual】CF63
顺利 AK,提前下班。
C 因为没有处理答案有前导零的情况吃了一发罚时,D 分类讨论起始点的时候写错一个小地方也吃了一发罚时,E 吃了两发罚时,第一发是没有正确处理直线对应的位置,第二发是没有注意数组大小。
赛后看了 rng,他考虑到 C 题每一个数长度固定,直接用 string 代替 int,写的要简单一点,而且不用考虑前导零等奇奇怪怪的问题。他的 D 中直接用循环处理出路径,然后按 \(x_i\) 分段标上编号,比我直接模拟路径,考虑很多情况去转弯要简单很多。
他的 E 题我不明白为什么要打表打出所有直线,这样虽然容易错,但打对了就不会出现像我第一发罚时的那样,在把六边形左对齐,分行数是否在前 \(2\) 行两种情况去变换列数时出现一些很细节的错误,各有各的优点吧。
ABC254
连续寄三场 at 了,心态直接爆炸。
这次 D 题做了我将近一个小时,按正常 D 的速度,我足够能在比赛时较快完成 F(因为我 30min 不到就补出来了),就上大分了,甚至还能冲冲 GH。
赛时我对 D 的第一想法是,枚举完全平方数 \(x\),然后在 \(\sqrt{x}\) 范围内枚举因数 \(d\),那么 \(d,d^2\) 都是 \(x\) 的因数,我一直认为这样能找出 \(x\) 所有的因数,实则不然,我在开题 50min 后才发现这一点,前 50min 我都在怀疑是重复统计和遗漏的问题,真搞不懂我那些时候盯着错解看半天是怎么想的。
之后做题的时候,不能再对所谓的“简单题”轻视了,只要有推理或者转化都要去证明,减少所谓的猜结论,再简单的比赛都要以稳健为主。
调整心态去了。。。
【Virtual】CF62
整出了 ABD,C 弃疗。
看了 hos.lyric,他的 B 用两个数组,L 和 R,处理处某一个点前面的最近相同字符和后面最近相同字符,做到每次查询 \(O(1)\),我是写的二分,每次查询要 \(O(n \log n)\),理论上范围大一点可以卡掉。他的 D 我不懂为什么要求连通性,求桥,然后去 dfs。我是直接 dfs,记录当前深度,目前节点,是否字典序超出原序列三个参数去贪心求解。
又看了 KrK 的 D,他的大体思路是找到前两条字典序 >= 给定序列字典序的序列,然后输出字典序较大的,用一个变量记录前面是否已经分出字典序大小,以此去确定当前节点后继的范围。
【Virtual】CF61
AK 了,C 挂了一发,没有特判 0 的情况。
看了 rng_58,他的 C 将罗马数字的所有字符放到数组里面,直接通过下标访问,比我重复四次,每次处理一位要简单很多,且不容易错,调试也方便,毕竟循环里面的东西只用写一遍。
他的 E 题思考角度是从三元组 \((i,j,k)\) 中间那个 \(j\) 入手,去统计左边满足条件的 \(i\) 和右边满足条件的 \(k\),分别从前往后,从后往前扫一遍用树状数组求解。我的思考角度是依次确定 \((i,j,k)\),定义 \(f(i,j)\) 表示第 \(i\) 个数作为三元组第 \(j\) 个位置的方案数,从左往右扫一次就行了,虽然时间复杂度很接近,但是我的方法要开两个 BIT,空间翻了一倍,如果将空间卡一卡,卡到 \(64\text{MB}\) 或者更小就挂了。
【Virtual】CF55
做出了 A-D,C 把结论推错了,挂了一发(如果草稿纸上画的是整个棋盘而不是局部图可能就不会错了,思考不全面),D 挂了三发,第一次 WA 是因为没有初始化,第二次 TLE 是记忆化那里写挂了,第三发 TLE 是在多测的时候,可以用上一个测试数据跑出来的结果去减少下一个测试数据的次数,而我看到 \(t \le 10\),直接重新算,由于远古题时间要乘以 2,再加上本人是大常数选手,就超时了。
看了 rng_58,他的 B 为什么不写递归啊,将每一层分开写,而且不写循环,这样是真的容易错啊,前年 csp 的儒略历我就是懒得写循环然后爆零了,从那时起,次数不管多小我都去写循环。他的 D 为什么要在状态里面记录是大于还是等于,这个题目空间很紧,这样做直接将空间乘以 2,而且等于的情况很少,直接特判一下就行了吧。
ABC255
终于不寄了,把前两场掉的分补回来了。
赛时做出了 A-F,中途因为没仔细算时间复杂度吃了两发罚时,又因为没有注意边界情况吃了一发罚时,此外 E 用的时间过长了,而且最终 AC 时的做法也比较繁琐,在 TLE 做法中改一下枚举顺序就可以通过了。
赛后补了 H,用的是动态开点线段树,图中因为取模,数组大小不够等问题挂了五六发,最终卡着空间限制过的。现场第一试用的 map 维护每一个线段的最晚修改时间,现场第二第三将所有询问离线,把端点离散化,普通线段树就能解决,顶级选手,用的是 map 和 set 等简单的方法,如果用到 ds 也不会是太高级的 ds,比如用离散化+普通线段树代替动态开点,用思维去换码量,对于细节处理,什么时候取模,取模后会有什么问题,什么时候不能取模,这些对于顶尖高手来说已经是一种直觉了,基本上不会挂。
【Virtual】 CF109
做出了 A~D,A 因为没有特判全是 7 的情况挂了一发,B 没有处理重复计数又挂了一发,这两发挂的是可以避免的。
赛后看了 rng_58,他的 A,4 的个数只枚举了 0~6,比我枚举 0~n/4 要优秀,BCD 写的和我差不多,就不多说了。
ABC258
这场比赛,本来能不吃罚时,打满 performance 的,直接少加 40rt。
B 题吃了一发罚时,这算是一个小失误吧,罚时的原因是将坐标 -1 时,取模没有正确处理。
E 题吃了三发罚时,也浪费了许多时间调试,一开始我是记录每一盒土豆的末尾,然后去计算循环节,但这存在一个问题,对于第一盒土豆可能处理不好(样例 1 就是例子),然后我改成了记录每一盒的开头,就 AC 了,中途因为数组开小 RE 了一发,这一发罚时是不应该吃的。
这场比赛没有发挥出自己全部的实力,但积累了一些经验,比如坐标变换的边界处理,取模的负数情况,循环节怎样记录方便且容易写对等等。这场比赛的 2100 分段(即过了 A~E 和 G),横跨 performance 从 2400 到 2000,我认为这场比赛,能不能打好,取决于前 5 题能不能写的又快又对。

浙公网安备 33010602011771号