板子里面容易写挂的地方
普遍性错误
- 不加编译命令的vsc,int函数不带返回值是不会报错的,太坑。
- 双向边一定要开两倍空间。
线段树
- 查询和修改都要 \(pushdown\)。
- \(build\) 里面要给 \(l\) 和 $ r$ 赋初值 (+2)。
- 查询的时候复制粘贴修改的代码时,记得还要加上 \(query\)。
- 部分线段树板子里面要注意叶子结点的 pushup 特判(奇偶覆盖扫描线)。
01Trie
- 不知道为什么,但是初始深度最好开大一点。举个例子,如果说 \(V=10^9\) 对应二进制下有 \(30\) 位,那么最好开 \(33\) 以上。
倍增LCA
- \(Fa[x][20]\) \(20\) 一定要写大一点,比如 \(30\) ,否则枚举小一点,不然越界很麻烦
- 根节点一定要 \(dep=1\) ,否则就会与 \(0\) 号节点同深度,出现问题(实际上树上倍增问题很大一部分都会因为根节点信息没处理好,导致在询问中有根节点的时候出错)
- 交换 倍增维度 和 节点维度 可以得到巨量的常数优化。
树链剖分
- 这个里面 \(dep\) 的初值是不是 \(1\) 无所谓,但是每个点 \(siz\) 一定要赋初值为 \(1\) ,因为查询和确定重儿子的时候均会涉及到。
- 路径查询的时候比较的是重链顶端节点的深度,而不是当前节点的深度。
- 树剖 LCA 的常数很小。
GCD
-
写成
return y==0?x:gcd(y,x%y);//而不是return x%y==0?x:gcd(y,x%y);
Trie
- \(0\) 号节点也需要清空。
分块
- 在拆分询问区间 \([l,r]\) 的时候,记得要特判一下 \(l\) 和 \(r\) 所在块相同的情况。
为什么要练,为什么要写?
引用一句让我幡然悔悟的话:
“练了不一定写的出来正解,不练一定写不出来正解”
本文来自博客园,作者:Hanggoash,转载请注明原文链接:https://www.cnblogs.com/Hanggoash/p/18385000

浙公网安备 33010602011771号