【错误总结】
这里记录一下写代码犯过的错误。
-
基环树找环的时候要判断走到这一个环上点为止
-
每次新找环都要清空栈
-
找到环不要贸然
return
, 要在这一次 dfs 中标记好所有点。 -
如果要累计贡献并改变节点位置,先累计贡献,再移动节点。
-
如果有形如无法匹配的 \(dp\) 失配,记得它可能会记录某些状态来继续转移。如 CF700E
-
找环的时候不要随便把边当成无向的!!!找环一定用有向图!!有向图不需要判断父亲!!!
-
搜索记录信息的时候不要直接拿点的状态记录,要对点进行标号以防止信息交叉
-
注意 dp 的时候看看需要的信息,不要把范围弄小了让某些需要的信息没有被 dp 到!!!
-
注意 vcc 缩点以及求割点的时候! ch 的位置不要乱放!就是应该在
!dfn[j]
的底下! -
dp 的时候别忘了取模!!!!
-
dij 用堆的时候记得原本的堆是大根堆,要变成小根堆就给它一个相反的小于号!!!!
-
求次短路能 \(dp\) 就 \(dp,\) 直接写 bug 太多了……
-
dp 的时候一定要把所有能转移到的状态都写上,尤其注意要不要转移 \(0!\) 因为往往带 \(-1\) 转移的时候就要特判一下 \(0\) 的位置!
-
考虑好哪些东西可以被转化掉从而变成冗余状态!!!
-
求指数的时候取模要改!应该模 \(\varphi(p)\) !!!
-
一定不要写着写着忘记取模!!!!!!!!!!!!!!!!!!!!!!!!!
-
string 是什么傻逼 加法复杂度不对 直接用
vector<char>
即可 -
如果需要线段树维护线性基,先考虑能不能点分治,因为如果是树剖线性基是四个 \(\log\) 接近于 \(n^2;\) 而且合并线性基的时候一定要注意常数优化,第 \(i\) 位的线性基只会往更低的位次充当线性基
-
fwrite
的输出是需要存储所有的输出字符的,如果输出量太大并且空间不足就不要用它 -
树同构的时候,如果用最小表示法,那么它是 \(O(n^2)\) 的,但是用树哈希可以做到 \(O(n).\) 也可以两遍树形 \(dp,\) 也可以考虑直接换根 \(dp.\) 注意哈希公式要用:
注意要取模或者直接自然溢出。
-
斐波那契数列的增长速度是接近于 \(2^n\) 的。
-
注意观察堆的正确性。用
queue
广搜的时候如果不加堆优化,复杂度实际上是不太对的;用堆的时候要谨慎堆的重载运算符和正确性。 -
不要随便
break
-
注意斜率不要想反!想象一下 \(k>0\) 的一次函数图像!更倾斜不一定斜率更大!有可能是负数!
-
注意之前写过的语句要删干净!要不然留一个
for
复杂度直接就炸了!!! -
写线段树优化建图要注意,往外连的边一定是儿子连自己,往里面连的边是自己连儿子。是有向边。不要写反
-
写线段树注意空间问题,不要都开一个
int tr[N]
和前面线性数组开一样大,这样容易 \(MLE\or RE\) -
DAG 上求每个点走到它能到达的所有点,这是一个世纪难题 bfs 会算重
-
这个傻逼连计算括号匹配数都能算错 快来笑话他) 注意求括号匹配数的时候一旦 \(sum<0\) 了,要直接把它当成 \(0,\) 要不然会落下一部分括号。
-
如果看到后缀表达式一类的东西,表达式树是一定要考虑的!!!
-
深搜不行就多想想广搜
-
读题一定要注意题干的每一句话!一旦有条件用不上那基本上就是 GG 了
-
写部分分一定要分清 Sub !要不然一个 Sub 挂了就把其他的所有分都挂没了!! 一定要把 Sub 分清 不要判断错!!!!!!!!!!!!!!!!!!!!!!!!!!
-
有一类运算的值域不是最大值!!!比如异或!!!!求值域的时候一定要谨慎 开小了就全挂!!!!!!!!!!
-
缺省源一定要记得改模数!!!!!!!!不要模错改半天!!!!!!
-
注意不依赖数组下标实际上 \(100\) 位也可以状态压缩成
int128
!! 或者直接bitset
-
不要注释文件!!!!!
-
整体二分注意哪些是答案更大的 不要写反!!!!! 不要轻易放弃自己写的代码!!!! 想清楚再考虑!!!!!!!!!
-
dfs 暴力判环长一定要谨慎是不是错的复杂度 !!! 判断数的倍数等题可以用拆点的方式拆成模意义下不同点!!!
-
筛因数个数不要根号暴力!!!考虑直接枚举一个数再枚举倍数就可以做到调和级数!!!!
-
当需要维护最长次长链的时候!!! 注意看看是不是直径!!! 那样有可能可以直接 bfs !!!
-
代码一定要一边写一边存盘!!!!!!!!!!!最后测的数据死机就完蛋了!!!!
-
\(\binom{l}{2}-\binom{l-1}{2}=\frac{l\times (l-1)-(l-1)\times (l-2)}{2}=\frac{(l-1)(2)}{2}=l-1\)
-
最后几分钟要把代码编译一遍!!!
-
写题一定一定一定要看好空间限制!!!!!!!!!
-
不要写错文件名字!!!直接复制!!!
-
用
system("fc")
的时候不要比较错文件!!!!!! -
预处理逆元一定要处理到 \(inv[0]\) !!!!!!!!!!!!!!!!!
-
建立新图的时候一定不要调用成原图的点!!!!!!!
-
写
kmp
看好是哪个点往前推len
单位长度! -
注意空间限制 像是 \(256M,128M\) 这种,开完空间一定要好好算一下会不会炸掉,还有卡空间的题一定要避免
#define int long long
-
判断是否大于等于 \(0\) 一定要写成
if(x>=0)
!!!!!!!!!!!!!!!!!!!因为负数直接if(x)
是错的!!!!! -
上下界网络流建立差分网络看好上界是不是无穷大!!!!!!!!!!
-
网络流构造的时候要把抽象的边画出来仔细看看!!!!!!!!!!!!!!
-
枚举子集记好!!! 对于集合 \(T,\) 枚举子集的写法为:
for(int S=T;S;S=T&(S-1))
-
dp 的时候,一定要尽可能把所有边界都 \(dp\) 到,比如那种可以走到 \(f[0][x]\) 的,往往会忽略在 \(0\) 处的 \(dp\) 值,这样会导致错误!!!!!
-
跳棋模型可以看成二叉树!!!!!
-
注意初值!!!尤其是取最大值什么的 看看能不能取它自己!!!!!!
-
造特别大的树的时候 不考虑
prufer
的情况下 可以每次存已经连了的点,然后从这些点里面随机点再向外连 -
网络流题目想匹配!!!!!!!!!!!!!!!!!
-
相邻格子同时加减 黑白染色后两色格子总和不变!!!!!!!
-
ISAP 注意不要写
e[i^1].flow-=tmp
-
写快速幂一类的只写
while(x){...,x>>1}
这种 因为这种一定不会炸!!!!!!!!!!! -
注意判断
1<<i
的时候,看看到底是不是1ll<<i
!!!!!!!!!!! -
手动控制二分次数 一定要卡死了算!!!尤其是 check 函数复杂度比较大的时候!!!!!!!! 差不多一位精度要四次!!!!
-
组合计数当 \(m\not =n\) 的时候!!钦定行列的时候一定要看好到底是 \(i\times m\) 还是 \(i\times n\) !!因为钦定行减掉的是列的个数!!!
-
LCT 维护最小值的时候!注意赋初值!在没有孩子节点的时候如果最小值继承到空那么就会导致最小值边权是 0 !所以要赋值为极大值,更新的时候注意判断孩子是否为空!
-
findroot
里面不能改变根!要access(x),splay(x)
-
写背包的时候,尤其是带删除或者实现了插入函数的时候,一定要把能走到的体积这一个维度卡好,可以降很多常数。uoj692
-
整体二分的
cnt1,cnt2
要在内部定义!!!! -
Fwrite
省空间的时候,在特判 \(0\) 的时候也需要注意及时采用fwrite(Obuf,1,O-Obuf,stdout),O=Obuf
,否则也会把空间炸掉!!! -
写线段树查询区间的时候,不能把边界 \([0,n]\) 和 \([1,n]\) 混用,这样到最后二分两侧找到的节点可能是错误的导致答案错误!
-
SAM 的节点数有 \(2n-1,\) 如果要搭配线段树就要注意卡空间的问题。尤其是既有
st
表又有线段树的时候,空间复杂度是两个 \(n\log n\) 需要精细计算。 -
-1
和任何数进行或运算都是-1
!!!! 以及判断的时候不要忘了!x
是判断不到 \(-1\) 的!!! -
换根 \(dp\) 的时候,如果加的是双向边并且是要做子树背包一类和子节点有关系的信息的时候,需要注意单独处理父亲节点信息的时候,一定要特判掉父亲,避免重复计算!!!!
-
值域大的时候看看开的
inf
是不是足够大!!!!!!!!! -
一定要注意空间是不是开爆了!!!!开空间之后一定要算一算空间!!!!