退役操作集锦

  1. 打错freopen,不删freopen,OJ交题不删调试什么的。
  2. INF = 1 << 30,memset了0x3f,最短路,导致奇怪的bug。
  3. 网络流板子打错,因为网络流的玄学性,错板子过了题结果一直错着。
  4. 莫队忘记给每个位置标记在哪个块就去排序…TLE。
  5. node.x 和 x 分不清。变量名字不重复最好。
  6. n和m范围不一样挂掉(这个太多了…)
  7. 答案int范围,过程中爆了int,不开long long见祖宗 还有不取膜爆long long的!!!!
  8. 位运算不加括号。
  9. 任何图论题没有特殊说明一定考虑不连通的情况!!!
  10. 压行,把循环里那玩意写成了注释掉的东西,成功挂掉。
1
2
3
4
5
for (int i = 1; i <= m; ++i) {
int x = rd(), y = rd();
a[i] = y - d[x];
}
// a[i] = -(d[rd()] - rd());
  1. 求阶乘逆元的时候不求0!的
  2. 对于每次操作都需要用新空间的题,数组按照操作数开大小,没给初始序列开。[TJOI2019]甲苯先生的滚榜
  3. 两段差不多的代码,直接粘贴过去用,没改全炸了。
  4. splay中如果存在多个值一样的点,随便找一个转到根之后,剩下的不全在左子树!!!!!!!
  5. 都知道无向图数组要开二倍,然而,和无向图边有关的数组都要开二倍!!!!!!!!!!!求割边,挂了,有什么好说的…
  6. 函数有个参数是bool,表示类型,传了个int进去,1/-1,GG。
  7. Splay板子打错两行泪T_T
  8. 这两句不一样!!!FFT的泪水
1
2
ans += A[i].x / lim + 0.5;
ans += (int)(A[i].x / lim + 0.5);
  1. 线段树不pushdown
  2. 分类讨论不完全。。。直接变最低档暴力分,太丢人了
  3. 不算内存见祖宗,这个已经114514次了…MDZZ
  4. diff a.out b.out -wZB !!!!!
  5. 高斯小圆卡顺序:随机化
  6. 算空间算错(指算大感觉MLE不写了)
  7. 欧拉回路 和边有关开二倍
  8. SAM p,np,q,nq分不清 小数据经常能过
  9. 写FFT,DFT共轭复数,要求j = i ? lim - i : 0。写了j = (L - i) & (L - 1)而不是j = (lim - i) & (lim - 1)调半小时
  10. FFT,求exp,注意别求Lim求的炸掉边界。。。
  11. 看题不仔细。。。输入是整数yy小数做法 必须选数字yy了不选的做法,etc……….
  12. [0,n-1]标号的图做dfs,初始fa不能是0。。。。。
  13. 把x,y用一个数存,x * 10 + y,然后x应该是0-9不能是1-10。。。
  14. 结构体里的构造函数,直接调用并没有什么用,会生成新数组,不能用来初始化现在的数组
  15. 极角排序,能用叉积就不要用atan2,被卡爆
1
2
3
4
5
6
bool operator<(const Node &x, const Node &y) {
int a = x.dx < 0 x.dx == 0 && x.dy < 0,
b = y.dx < 0 y.dx == 0 && y.dy < 0;
if (a != b) return a < b;
return cross(x, y) > 0;
}
  1. 双指针扫可以绕圈的环形的时候,注意有没有绕圈次数过多(比如第二个指针在第一个指针前面,结果每次判断如果第二个小于第一个就等于第一个这种睿智操作。。。
  2. 使用A[i] != A[i + 1]计数的时候,如果多测,记得单独设置A[n + 1]
  3. 某仙人掌板子题,环上DP,需要两种方向绕环,写的是1->n与1->n->2,第二种算两点距离挂了
  4. 某FFT题,FFT过程中要用到fac[n],统计答案的时候只用到fac[m],于是阶乘就没算更大的。。。这个故事告诉我,阶乘这种东西,数组开多大算多大。。。。。。。。
  5. 记一个小Trick:优化两数相加取模的速度:
1
x -= P, x += x >> 31 & P;
  1. 当需要维护一条链,要求不在链上的子树的内容,一个优秀的做法是在x维护x父亲去掉x的答案。一个愚蠢的做法是树剖+处理链。。。。后者特别难写。。。
  2. 设计一个单调性类的DP,当点j的意义是f[j-1]+S(j)的时候,别忘了i可以从f[i-1]转移来,也就是要额外用自己算一下自己
  3. 分治FFT,从序列开始选一段,从l开始选一段。注意是要求的那个从l开始选,一开始就有的从0开始选!!
  4. 2SAT直接用线段树式的开点法(2x,2x+1),并封装addedge()一次性加正反边是很优秀的做法。
  5. 关于std::swap的复杂度:

swap 数组是O(数组长度的) swap std::set是O(1)的 在c++11后,所有常用的STL里的都是O(1)

  1. 启发式合并维护链并:注意合并的时候,一条一条加入,并且直接计算新的贡献(旧的它死了)
  2. 注意二维前缀和的正确写法……
  3. 论如何卡启发式合并常数:二叉树