Trick 积累
-
求中位数最大值的时候可以二分一个 \(mid\) ,将大于 \(mid\) 的数赋值为 \(1\),否则为 \(-1\)。判断是否有区间和大于 \(0\) 就可以判断出中位数能否大于 \(mid\) 了。(Freezing with style)
-
看到 \(n \le 15\) 这种数据范围且是一道计数题考虑状压容斥。(CWOI)
-
树上 \(u\) 到 \(v\) 路径上的异或和可以转化为 \(u\) 到根的异或和异或上 \(v\) 到根的异或和。(P3401)
-
如果两个数乘起来为平方数,可以先将每个数的平方因子除掉,然后这两个数必然相等。(CWOI)
-
如果 \(01\) 串一段区间内有奇数个 \(1\),可以转化为这段区间的异或和为 \(1\)(CWOI)
-
区间 \(l\) 到 \(r\) 内 \(x\) 最后一次出现的位置减去 \(x\) 第一次出现的位置等于 \(\sum i-pre_{i}(l \le pre_{i},i \le r,a_{i}=x)\)(CF848C)
-
对于一棵树,如果一个点到其它点的距离和是所有点中最小的,那么此点为重心。(CWOI)
-
(\(a_i\) | (\(a_j\) & \(a_k\))) 等价于 \(a_i\) + (\(\bar{a_i}\) & \(a_j\) & \(a_k\)),其中 \(\bar{a_i}\) 为 \(a_i\) 的补集。(CF1208F)
-
一个排列中的某个区间排序过后是一个差为 \(1\) 的等差数列等价于 \(\max-\min+1\) 等于区间长度。(CWOI)
-
有关相邻两数之差想到差分。(CWOI)
-
积性函数可以通过线性筛进行 \(O(n)\) 递推。(CWOI)
-
正难则反(CWOI)
-
网格图可以通过黑白染色转化为二分图(P2774)
-
判断 \(a_i\) 是否是在 \([l,r]\) 中第一次出现等价于判断 \(last_{a_i}<l\)。(P1972)
-
\(\text{mex}_{j=1}^{i}a_j=\min_{j=i+1}^n a_j\)。(CF1905D)
-
有些时候可以尝试改变 dp 转移时的枚举顺序,把需要用来做转移的维度放到第一维去枚举。(CF1517D)
-
求一个某个值的区间和可以尝试用前缀和即 \(f(l,r)=f(r)-f(l-1)\)(P3935)
-
对于一些计数题可能不需要考虑每个数具体的值而只需要考虑两个数之间的大小关系(P2606)
-
\(i \times j\) 的约数个数等于 \(\sum_{x | i} \sum_{y | j} [\gcd(x,y)=1]\)。(P3327)
-
如果要计算浮点数乘法,为了不被卡精度,可以把每个数表示为 \(2^x\) 然后变为指数的加法。
-
如果最终要求的期望但是不好直接算期望,可以先算概率,最终每个概率乘上它对应的贡献。(CF498B)
-
如果要爆搜且最终层数不深,为了防止搜到很深的层数,可以使用迭代加深搜索。(CF93C)
-
用 \(\text{dp}\) 来计算价值或者计数时,如果不好直接算出贡献或者贡献有后效性,可以考虑把贡献拆开计算。(P10254)
-
当时间复杂度和 \(\sum size_u\) 有关的时候考虑启发式合并(P7118)
-
\(\max(a_j-a_i,0)=\max(a_j,a_i)-a_i\)(ABC351F)
-
\(01\) 矩阵可以联想到图的邻接矩阵。(CWOI)
-
图的邻接矩阵的 \(k\) 次方 \((A^k)_{i,j}=0\) 表示从 \(i\) 到 \(j\) 没有一条长度为 \(k\) 的路径。(CWOI)
-
对于一个带点权的有向环,若点权总和非负,则一定存在一个点 \(i\),使得 \(i\) 到任意一个点的路径上的点权和都非负。(P10412)
-
若 dp 的答案很小,可以考虑交换 dp 的答案与状态,来减少时间复杂度(AGC033D)
-
对于一个不降序列 \(a\) 和它的差分数组 \(b\),有 \(\max(a_i)=\sum b_i\)。(ARC178C)
-
判断一个序列是否为 \(0101\dots\) 等价于判断差分数组的绝对值是否全为 \(1\),也等价于判断异或数组是否全为 \(1\)。(CWOI)
-
若网格图(包含白点和黑点)中的所有黑点恰好组成一个矩形当且仅当 \(sum_1+sum_3=4\),其中 \(sum_i\) 指有多少个 \(2\times 2\) 的网格中有 \(i\) 个黑点。(P4898)
-
不强制在线的题先考虑离线做(ABC356F)
-
曼哈顿距离和切比雪夫距离的互相转化(CF1979E)
-
对于一个质数 \(n\),若 \(i \not\equiv j \pmod{n},k \not\equiv 0 \pmod{n}\),则 \(ik \not\equiv jk \pmod{n}\)。(CF1734E)
-
对于一个质数 \(n\),若 \(xy \equiv 0 \pmod{n}\),则 \(x \equiv 0 \pmod{n}\) 或 \(y \equiv 0 \pmod{n}\)。(上面的另一个形式)
-
如果构造题要求构造出来的方案的值小于或大于某个值,可以考虑抽屉原理。(CF1450C2)
-
左旋和右旋后中序遍历不变。(CWOI)
-
对于一些含有 \(\min(A,B)\) 的式子可以分类讨论 \(A,B\) 哪个更大(qoj1281)
-
考虑时间复杂度的时候有一个经典的思想:若每一次都翻倍,那么总次数是 \(\log\) 级别的。(qoj1249)
-
若所有 \(a_i \mid lcm(b),b_i \mid lcm(a)\),那么 \(lcm(a)=lcm(b)\)。(CF1656H)
-
\(a_i \nmid lcm(b)\) 等价于 \(lcm_{j=1}^{m}(\gcd(a_i,b_j))<a_i\)。(CF1656H)
-
如果将排列 \(p\) 看成一张图,若 \(i,j\) 不在同一个环内,那么交换 \(p_i\) 和 \(p_j\) 可以使 \(i,j\) 所在环合并。若 \(i,j\) 不在同一个环内,那么交换 \(p_i\) 和 \(p_j\) 可以使 \(i,j\) 所在环分裂。(CF1656G)
-
考虑二进制最大 / 最小值时可以从高到低 / 从低到高考虑。
-
若 \(x,y,z\) 中 \(x \ge 2^b、y,z <2^b\),那么 \(x+(y\ \&\ z)>(x \ \&\ y)+z\)。(qoj1436)
-
判断两个区间是否相等可以用哈希。(ABC367F)
-
\(n\) 个 \((\),\(m\) 个 \()\) 的括号序列可以转化为网格图上从 \((0,0)\) 到 \((n,m)\) 的一条路径。
-
网格图上求从 \((0,0)\) 到 \((n,m)\) 且必须经过某个一次函数的路径,一个经典的技巧是找到第一次经过该函数的位置,把后半部分的路径沿这个函数对称。
-
对折线图计数可以考虑连续段 dp(P5999)
-
看到求生成树个数,考虑矩阵树定理。(CF917D)
-
如果要求全部满足条件或者全部不满足条件,可以考虑容斥。
-
一维随机游走的期望距离是 \(\sqrt{n}\)。(P7606)
-
计算某个式子的值可以考虑它的组合意义。(CWOI)
-
维护删边操作可以把整个操作序列倒过来就变成了维护加边操作(ABC375F)
-
\(n=\sum_{d \mid n} \phi(d)\)(ARC185E)
-
\(\gcd(i,j)= \sum_{d \mid i,d \mid j} \phi(d) = \sum_{d \mid i} \phi(d)[d \mid j]\)(ARC185E)
-
若 \(C_{n}^{m}\) 为奇数,则说明 \(m\) 的二进制位是 \(n\) 的二进制位的子集。(ARC156D)
-
若 \(C_{n}^{s_1,s_2,s_3,\dots,s_k}\) 为奇数,则说明 \(s_1,s_2,s_3,\dots,s_k\) 的二进制位是 \(n\) 的二进制位的划分子集。(ARC156D)
-
维护类似与向上跳的操作可以考虑倍增(CF1707E)