这里记录一些做题时学到的结论 & 套路 & 注意事项。
- 区间 [l,r] 内的下标 x 在该区间翻转后的下标是 l+r−x。
- 维护 01 序列的时候,可以维护所有 0/1 的下标。
- 一个数 v≥1 在 O(loglogv) 次开方下取整后变为 1。
- 不刻意卡的 O(wn) 比 O(logn) 快很多。
- 带修莫队的块长取 1.7n0.667 更快。
- bitset 优化埃氏筛比线性筛快。
- mex 的值最多是 n+1。
std::multiset 删元素要用 erase(find(val))。
- 写出类似
for (int i = 1; i <= k; i++) v = x[v]; 的代码时都可以倍增优化到 O(logk)。
- 点权最短路和边权没什么区别。
- 当 x⊕y=gcd(x,y)=z 时,必有 x−y=z。UVA12716。
- 经过一个点的最小环等价于次短路问题。
- 多项式哈希的线性性:有 ∑i=1nk×si×Bn−i+∑i=1nb×Bn−i=k×hn+b。因此可以上线段树维护。
- 最小化 最大+次大 时,绝大部分是枚举最大找最小的次大。
- 求 ∑(aimodM) 时,不妨求 ∑ai+kM。ABC378-E。
- 删点 / 覆盖问题可以倒序做变成加点 / 去覆盖。
- 设计 dp 时,可以考虑用两维的特征压成一维记录。P5664。
- 环上问题可以倒着想,例如 max 变成 max(max,∑−min)。
- 将奇形怪状的东西放到棋盘里,对棋盘进行黑白染色。则两种颜色的个数为 ⌊2nm⌋ 与 ⌈2nm⌉。
- 类似 2b=a+c 的三元组统计,考虑求多项式卷积。ABC392-G。
- max(x,y)=2x+y+∣x−y∣。
- 满足 xi>0,∑i=1nxi=1 的
x1+x1x2+x1x2x3+⋯=i=1∑nj=1∏iaj
的最小值为 33n。
- 对于双端点询问 [l,r],若有 [1,r]−[1,l−1] 可变为单端点询问。
- 对于四端点询问 [l1,r1,l2,r2],若有 [1,r]−[1,l−1] 可变为双端点询问 [r1,r2]−[l1−1,r2]−[r1,l2−1]+[l1−1,l2−1]。
- 用 Dijkstra 求最短路,要求松弛函数 f(disv,w) 满足两个条件:f(disv,w)≥disv 且关于 disv 单调递增。
- 树上问题对一条路径的边权异或,可以化边为点,等价于对端点异或。
- 随机排列的 LIS 长度是 O(n) 级别的。
- 折半警报器 / 二进制警报器:P7603。
- 将题目转化为最短哈密顿路时,往往考虑变成欧拉回路。
- 二分图博弈的结论:存在一个点属于所有最大匹配先手必胜(且作为起点),否则先手必败。P4617。结合黑白染色。
- dsu on tree:先 dfs 轻儿子并清空,再 dfs 重儿子不清空,然后再加入所有亲儿子的信息,复杂度为 O(nlogn)。
- 对小于 / 大于某数的计数,如果小于 = 大于,考虑转化为 2总数−等于。CF1227F2。