姊妹文章:一些解题中的小技巧
- 开(long~long)
- 解密对拍后上交时需加密
- 若存在多组数据,每组数据中读入连串数据,若在读入时判无解,需要将剩下的数据读完
- 开(O2)时不要在同一个式子里多次改变一个量
- 记得写(return)
- 在幂处取模应对(p-1)取模
- 找规律
搜索
- 用了任何剪枝都不要忘记防止反向操作,否则优化再好也是渣
FFT
- 在处理nn时要求(nn>2n)(因为答案两倍长度)
- 两倍空间
高斯消元
-
求方程时,在消完当前格后要将所有行([1,n])的全部消除,不仅限于([i,n])
-
求行列式时,记录行交换了多少次,记得交换一次就要变号
凸包
- (nleq 2)时要特判
带修莫队
- (blk=pow(n,3/5))的话时间复杂度是有问题的,整数意义下(3/5=0),块大小为(1),要写成(blk=pow(n,3.0/5))
主席树
- 统计权值时记得考虑当前节点选却不全选的情况
- 空间开爆
后缀自动机
- 儿子数组要开到字符集大小,不要受平衡树的影响只开(2)
- 总数组需要开两倍空间
- 广义后缀自动机不能使用基数排序,需要建出 (parent) 树(因为广义 (mathrm{SAM})中存在节点与 (parent) 的 (longest) 相同的情况,基数排序无法区分)
矩阵树
- 外向树用入度,内向树用出度
- 余子式需消去根的那一行
欧拉回路
- 当前弧优化
set
- 在将struct结构体放入set的时候,重载 < 号需要严格区分两个相同物品,否则会导致元素缺失,或使用multiset
LCT
- 在每次进行查询
find
操作时,要注意边下放标记边寻找,最后需要splay一下,否则可能被卡 - 在cut操作时,为了保证删除的边存在,可以加一个判断
ch[y][0] and !ch[x][1]
,后者可以保证删除为边而非链
int find(int x){access(x), splay(x), down(x); while(L) x = L, down(x); return x;}
void cut(int x,int y){split(x,y); if(ch[y][0] and !ch[x][1]) fa[x] = ch[y][0] = 0;}