备 忘 录

  • 近日,某蒟蒻在校测中多次犯烧杯错误,再加上本身实力有限,于是多次垫底,便有了这篇博客。
  • 没开long long
  • 数组开小/开大
  • 未考虑图中的自环、重边
  • 多层循环混用\(i,j\)等变量
  • 未考虑图不连通的情况
  • 无负权边的图中跑SPFA
  • 忽略逻辑运算符优先级顺序

小括号\(()\) > 逻辑非 \(!\) > 乘、除、取模 > 加减 > 移位(\(>>\)\(<<\)) > 按位与& > 按位异或^ > 按位或| > 逻辑与 && > 逻辑或 || > 三目运算符 >赋值=
不清楚的话疯狂加括号就行了

  • 未初始化(特别是多组数据未清零)

  • 混用\(n,m\)等常用变量,看错输入顺序

  • 仔细审题,注意考察题中某些变量的可选范围,注意0、-1等边界或者注意可选范围是否包含字母/数字/下划线。

  • 注意输出时严格按照题目说明输出

  • 漏看了题目中的取模

  • 未删除调试信息

  • 文件名打错

  • 没开 unsigned long long、没特判 1<<64

  • 1uunsigned int,1ullunsigned 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\) 的值。

  • 。。。

posted @ 2021-05-23 22:44  cjTQX  阅读(214)  评论(0编辑  收藏  举报