这篇文章是必要的 至少我认为 可以提醒自己哪些是常见的坑点。
- 线段树合并常见错误点。
合并之前 子树线段树是有效的 如果在merge处不新建节点那么 儿子线段树是无效的 这点一定要注意!因为这个时候儿子线段树可能已经被修改了。
那么其实就有做法了在merge的时候新建节点不过这样空间消耗最坏是nlogn^2的接受不了的话那么就在递归和并的时候查询儿子操作 不要放在最后差 这点可以配套离线搞.先把要求的东西离线下来然后dfs线段树合并离线搞就很稳了。
2.FFT错误点
两个1e6的多项式相乘2e6但是数组要开到$2^{21}$=2097152这个大小才行也就是2100000。不然很容易RE。
3.枚举子集错误点
所谓二进制枚举子集 就是把一个二进制数的所有子集都给枚举出来 这点要注意而不只是只枚举了几个1的情况 这是我以前概念不清 至于两个for枚举二进制for枚举子集则是可以利用二项式定理证明。
4.后缀数组
把两个字符串接在一起时中间必须加入间隔符 防止第一个字符串用到第二个字符串的内容。重点哦。
5.莫队的优化
莫队有的时候是需要卡常的 有一个绝招是奇偶排序.
原本是这样排的:
int cmp(query a, query b) {
return belong[a.l] == belong[b.l] ? a.r < b.r : belong[a.l] < belong[b.l];
}
现在这样排序:
int cmp(query a, query b) {
return (belong[a.l] ^ belong[b.l]) ? belong[a.l] < belong[b.l] : ((belong[a.l] & 1) ? a.r < b.r : a.r > b.r);
}
这样 就可以优化大部分的常数啦...实测挺快的其实..
ST表LCA 注意数组不要开小这个东西是两倍 注意对于预处理的时候边界处理要正确 这个地方挂过很多次了。