- 这里记录一些近期训练中常见的问题。
I
- 常见的写挂原因
I. 1
-
某道题,问题经过转化之后,要求支持每个点上维护一个集合,每次加边或者查询某个连通块内所有点对应集合的并集,同时可能有删除操作。
-
并查集合并时,没有判
find(x) == find(y)
, -
由于是查询并集,故没有判这个东西不会影响正确性,但 (n) 一大就会
TLE
。
-
I. 2
-
一道计数题,先写了一个 DP。调试时发现这个 DP 的结果要乘上一个阶乘。
-
可这时候是急着去改的,故凭感觉在某一个
if
语句后面加了一个cnt++
,最后把答案乘上 (cnt!)。 -
过了样例。因为是计数题,感觉很稳
(再说了,暴力都写不了) -
而样例里刚好正确的 (cnt) 和我程序中算出来的假的 (cnt) 是一样的。
-
-
类似的错误还有:函数、变量的含义在写代码时搞混掉。
I. 3
-
一道题,给定一些数,不保证这些数互不相同。
-
算法实现的某一步要把所有的数从小到大排序,相同情况下按原下标从小到大排序。
-
排序的比较函数忘写第二关键字,大样例貌似所有的数互不相同。
-
I. 4
-
某交互题,第一发提交到 OJ 上时得到
CE
。 -
一开始以为是开库的原因,于是把
<bits/stdc++.h>
删了 -
但程序里有个
memset(a, INF, sizeof(a))
(实际上只需把 (a[1dots n]) 设为 (infty)) -
于是把这个
memset
改成了for (int i = 1; i <= n; i++) a[i] = INF;
,没有再测一遍样例。 -
交上去还是
CE
,后来才发现要用C++11
提交,于是用C++11
再交了一遍。-
可把
memset
改掉时忘了 (n) 是在后面的程序中计算得到的。 -
也就是说,这时的 (n=0),初始化和没有初始化无区别。
-
II
- 常见的策略失误或时间损耗
II. 1
- 题目中的关键信息在比赛中场甚至最后才看到。
II. 2
- 仅因为
long long
、取模、线段树标记没下传等原因调很久。
II. 3
- 套路不熟练导致的时间损耗。
II. 4
- 题目顺序、难题长得像简单题等导致的开题策略错误。
II. 5
-
也是最重要的:在对拍写过的题和尝试拿更高分之间的选择。
-
在某些比赛中,这一点处理不好会整场崩盘。
III
- 缺乏深入思考,导致时间损耗或该拿的分没拿到
III. 1
- 一有思路就开始码题,码完发现有一大堆没考虑到的细节。
III. 2
- 一有思路就开始码题,写了一个很麻烦的做法,但如果注意到问题特殊性质则不用那么麻烦。
III. 3
- 一有思路就开始码题,写了一个很麻烦的做法,最后假了,心态爆炸。
IV
- 提些 Codeforces 上的。
IV. 1
- 打
Div. 1
有时没有快速进入状态,A 题卡住一段时间。
IV. 2
hash
不随机模数被卡。
IV. 3
-
偶尔难度顺序会不正常。下面两个建议:
-
(1)先开当前
pp
人数最多的题。 -
(2)在
Div. 1
场中,遇到Div. 2
放Easy Version
而Div. 1
放Hard Version
的,谨慎开题。
-
IV. 4
- 遇到结论找不到反例但又不会证的题,可以尝试蒙一发交上去。
V
-
还有很多,就不一一列举了。
-
只希望省选之前能有突破吧。