调试遇到的坑
-
多测清空,全部全部清空, 不要直接 memset 整个数组, 结尾清空更合适。(\(\times 1\))
-
\(\text{array, pair}\) 等 STL 本身有重载运算符,不能重载,应该写 \(\mathrm{cmp}\).
-
检查数组越界,数组大小
-
线段树的修改,查询操作都要 \(\mathrm{pushdown}\)
-
注意双指针等 \(\mathrm{while}\) 循环的时候要检查越界(下标 -1 要特判)
-
树状数组不能维护 0-index 的信息
-
\(\mathrm{fhq-treap}\) 的 \(\mathrm{merge}\) 操作要注意 x 中所有的权值要小于 y 中所有权值,一个是 \(\mathrm{merge(tr[x].rs, y)}\), 一个是 \(\mathrm{merge(x, tr[y].ls)}\)
-
函数如果返回值不是 void 一定要 return!!!不然会被 O2 杀死!!!Failure_G 在 NOIP2025 中因为这个 T4 挂了 \(40\)。
-
基环树如果连双向边是可以有重边的 \(\mathrm{(a \rightarrow b, b \rightarrow a)}\) 找到环上的边删一条就可以了,即使用链式前向星或者找到这条边换到最后再 \(\mathrm{popback}\) (找到立即 \(\mathrm{break)}\), 否则会被二元环卡掉.
-
二分题要注意:如果我们二分 \(x\), 并且 \(\mathrm{check}\) 的是 \(\mathrm{calc(x)}\) 是否小于一个数, 然后计算一些和 \(x\) 有关的东西的时候要注意:也就是说临界位置有时候只要算一部分。 以一道典题为例,将一堆序列放在一起从小到大排序求前 \(k\) 小的数的和, 我们二分出第 \(k\) 小的数后, 要把小于这个数的都加上,并且等于这个数的只加一部分(这部分个数肯定 \(\le n\))。题目:https://bs.daimayuan.top/p/34
-
树套树里如果内层树是动态开点,则要把 节点个数 和 节点信息 记在外面,否则会被覆盖。
-
写 \(\mathrm{trie}\) 树的时候最好让根节点是 \(1\) 而不是 \(0\), 不然如果访问到叶子节点的 \(\mathrm{nxt}\) 可以会调用根节点的一些值
-
特判一定一定一定要写在最前面,否则可能会在执行特判之前进行一些奇奇怪怪的输出甚至直接结束. (\(\times 1\)) 教训:
https://atcoder.jp/contests/abc397/submissions/65722734 WA
https://atcoder.jp/contests/abc397/submissions/65722789 AC -
如果循环要让 \(i = l \to r\), \(l, r\) 是 int 范围, 那要把 i 开成 long long / unsigned , 否则 i 会在最后一次变成 INT_MIN
-
map, set 如果用的是自定义结构体类型一定要注意把重载运算符写完整!!!假如有 a, b, c, d 四个元素, 如果只写一个 return a < A.a; 会导致 map/set 认为 a 相同的元素就是相同的。
-
exgcd 中的 a, b 最好都弄成正的防止搞出负数 gcd 导致把 x, y 变成非负的时出现问题。(\(\times 1\))
-
dijkstra, priority_queue<pair<dis, pos>, vector<pair<dis,pos>>, greater<pair<dis,pos>>> dis, pos 顺序千万不能反. (\(\times 1\))
-
树上背包合并的时候,不能先 \(sz_u \leftarrow sz_u + sz_v\) 再合并前面的子树和 \(v\) 的子树,不然一条链会被卡死。
18. 算空间!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MLE 包死的。
-
遇到多测的判断题,不要在输入到一半就直接输出或者退出,否则可能会把这轮的输入带到下一轮。
-
在 Linux 环境下,long long inf = 1e15 会 CE, (ll) 1e15 就不会。(\(\times \ge 3\))
-
如果你要计算 \(a\) 并且同时要用 \(a\) 得到 \(b\),这时一定要注意在计算 \(b\) 的某一步时所需要的 \(a\) 是否都有了,最好的方法是分开写。
-
线段树区间加维护区间 \(\gcd\) 不要边加边取模!!!(3h)
-
杨辉三角预处理组合数一定要从 \(0\) 开始枚举,不然 \(\dbinom{0}{0}\) 会没有初值变成 \(0\),比如 CSPS2025T4 就会挂(1h)。
-
如果开一个比较大的数组,不应该赋初值,比如 a[1000000] = {0, 1, 3} 这样的,会导致编译器把一大坨初值信息写进去,导致编译器初始信息错误,这个比 MLE 还严重!!!是 1000000% 爆零的!!1(0.5h)
-
inline 别写了。。。Hoks 在 NOIP2025 中快读全写的 inline read() 全部爆零了,为 ta 惋惜的同时也启示大家不要写这个没一点用的 b 语法。
-
最好不用 printf, EroRain 在 NOIP2025 中 T4 因为 %llu 写成 $lld 了导致省选翻盘的难度又大了一点,这边祝 ta 翻盘。
-
一定一定一定不要忘了关闭同步流,不然你基本上会挂大量的分,Loop1st 在某次模拟赛中 T1 挂了 巨量 分。
-
线段树要
pushdown。 -
这个也不算坑,只是一个助于理解的东西,就是由于你每次都
pushdown的,所以每个节点来说,其父节点 \(tag\) 更新的时间戳肯定在其值更新的时间戳后面。 -
写指针的时候 buf 要和你要用的数组是一个类型的,比如长剖的时候要注意。
-
basic_string 非平凡类型是 ub!!!下次偷懒写 basic_string<pii/array/struct> 小心 re0!!!
-
baka's trick 使用时如果是用的 r 不断拓展,即
while(ask(l, r + 1)) r++并且统计时要写if(ask(l, r))则ask(l, r + 1)要改成ask(l, r, r + 1),最后一个参数是不用来更新 \(mid\) 的,如果不这么写可能会导致 \(mid > r\)。详见 link。 -
define 的时候括号要括对,比如 #define lowbit(x) x & -x,如果 x = 某个 a - b 就错了,(x) & (-x) 也是错的,(x) & -(x) 才对。

浙公网安备 33010602011771号