备 忘 录
- 近日,某蒟蒻在校测中多次犯烧杯错误,再加上本身实力有限,于是多次垫底,便有了这篇博客。
- 没开long long
- 数组开小/开大
- 未考虑图中的自环、重边
- 多层循环混用\(i,j\)等变量
- 未考虑图不连通的情况
- 无负权边的图中跑SPFA
- 忽略逻辑运算符优先级顺序
小括号\(()\) > 逻辑非 \(!\) > 乘、除、取模 > 加减 > 移位(\(>>\)与\(<<\)) > 按位与& > 按位异或^ > 按位或| > 逻辑与 && > 逻辑或 || > 三目运算符 >赋值=
不清楚的话疯狂加括号就行了
-
未初始化(特别是多组数据未清零)
-
混用\(n,m\)等常用变量,看错输入顺序
-
仔细审题,注意考察题中某些变量的可选范围,注意0、-1等边界或者注意可选范围是否包含字母/数字/下划线。
-
注意输出时严格按照题目说明输出
-
漏看了题目中的取模
-
未删除调试信息
-
文件名打错
-
没开
unsigned long long
、没特判1<<64
-
1u
是unsigned int
,1ull
是unsigned long long
-
一些有返回值的函数无返回值
-
直接用 .size() 函数和 \(int\) 比较会出锅,这导致我CF1119F调了一晚上。
-
不要将点双边双以及强连通分量的缩点方法弄混!具体参见这里。
-
注意模数,当模数不为质数时,无法使用费马小定理求逆元
-
const long long inf=1e18+2
由于精度问题会被视作1e18
-
atan2(y,x)
的返回值是 \((-\pi,\pi]\) -
单点修改维护全局乘法时,可能会出现某个数为模数的倍数,然后修改时就无法直接求逆,这时可以考虑用线段树进行维护。
-
在模数为质数,无法使用逆元时,可以辗转相除法作高斯消元,这里以求行列式的代码为例:
inline int matrix_tree(int n){
int ans=1;
for(int i=1;i<=n;++i){
if(!c[i][i]){
for(int j=i+1;j<=n;++j)
if(c[j][i]){swap(c[i],c[j]);ans=dec(0,ans);break;}
}
for(int j=i+1;j<=n;++j){
while(c[j][i]){
int d=c[i][i]/c[j][i];
for(int k=n;k>=i;--k)
c[i][k]=dec(c[i][k],c[j][k]*d%mod);
swap(c[i],c[j]);ans=dec(0,ans);
}
}
ans=ans*c[i][i]%mod;
}
return ans;
}
-
强连通分量缩点:若 \(v\) 被遍历过但在栈中则用 \(dfn[v]\) 更新 \(low[u]\),当 \(dfn[u]=low[u]\) 时形成一个强连通分量,一直弹出栈顶直到弹出 \(u\) 后结束。
-
边双连通分量缩点:与强连通分量缩点唯一的不同在于如果 \(v=fa_u\) 则不遍历 \(v\)。
-
点双连通分量缩点:这回在栈中需要存的是边,因为割点会在多个点双中出现,而边不会,于是每当遍历到新的边 \((u,v)\) 时都将 \((u,v)\) 加入栈中,同时如果 \(low_v\ge dfn_u\),即 \(u\) 是割点时进行缩点,不断弹出栈顶直到弹出边 \((u,v)\) 后结束
-
当转移是乘法时( \(x\to ix\) ),很多时候只关心 \(n/x\) 的值。
-
。。。