防错笔记
防错笔记
交题前一定检查自己复杂度对不对
检查 freopen 和 文件名
注意函数的返回值检查为double或longlong,特别是板子!
思考一下自己是否判断了所有情况。
int变量一定不要开成bool!!!!!重点检查vis数组是否用int了。
整数二分要写(l+r)>>1,负数向下取整。
实数二分注意/2.0
想不出来的时候去想dp。
可持久化01trie
1.每次新加入节点时更新rt。
2.记得初始化rt[0],边界插入0。
3.数组要开 \(O(n\log n)\)
4.在int范围内不能把树开成32位深度
后缀自动机SAM
1.数组开2倍
2.跳father时记得p=fa[p]。
后缀数组
- 注意求 \(rnk\) 时,比较的是 \(tp[sa[i]],tp[sa[i-1]]\) 和 \(tp[sa[i]+w],tp[sa[i-1]+w]\),注意是 \(+\)。
- 求 \(height\) 的时候 \(j=sa[rnk[i]-1]\),\(-1\) 在 \(rnk\) 外面,表示上一个排名。
- 基数排序的字符集大小是递增的,桶的大小到 \(O(N)\)。
主席树
-
数组空间开32倍。
-
不要 if(!x) return 0;,这不是线段树合并。
二分图
1.最大独立集输出方案:S能到达的且T不能到达的。
-
棋盘很大保存直线时,按照两条对角线方向保存。
即 \((x,y)\) 变为 \((x+y,y)\) 和 \((x-y,y)\)。
最短路
1.dij时记得更新vis数组。
2.每次取出点更新时记得 pop。
3.记得初始化 dis[s]=0。
博弈论
1.优先考虑sg函数,不要自己yy。
概率期望
1.分清楚 最大值的期望 和 期望的最大值。
2.dp转移时注意概率之间是乘积关系还是和的关系。
即条件概率还是并行的方案。整体限制。
\[P(A|B)=P(A)*P(B)
\]
CF494C:条件是整个区间 \(\le i+\max_u\) 那么必须满足每个子区间都 \(\max_v+j\le \max_u+i\)。
- 方差等于平方的期望减期望的平方
树上倍增
- 记得先处理倍增信息(mx,dis),再跳father(x=fa[x,i])。
- 倍增在边上,则最后只有到父亲的边没有处理。
- 倍增在点上,则最后自己和父亲都没有处理。
约数相关
1.推式子时注意考虑所有条件限制。
2.关注整除的条件,根据“每个数都是整数确定范围”。
3.在不取模做乘除法时,一定先除再乘,防止爆longlong。
异或
1.利用区间异或前缀和达到区间整体异或一个数,查询区间异或时,要分奇偶考虑,二维同理
因为异或两次等于0,只有和当前点奇偶性相同的点在前缀异或时才能够真正的异或上 \(x\) 。
树形dp
1.子树内的信息在 \(lca\) 处合并,在合并完两棵子树后把它们看作一棵新的大子树继续与后面合并。
计数
- 处理逆元时一定要处理 \(inv_0\)。
- 优先推式子,可以考虑组合意义。
图的连通性
- 缩点时一定分清是 \(i\) 还是 \(scc[i]\)。
最小割树
- 记得初始化点集q。
堆
-
默认是大根堆,但使用小于号比大小。
-
堆在重载小于号时,把满足条件的返回为 false,因为是大根堆,小于号是反着用的。
生成函数
- 注意第 $$
树上差分
1.记得区分点差分还是边差分。