Tricks
-
枚举子集:j=(j-1)&i,复杂度为 \(\mathcal O(3^n)\)
-
树上链加,单点和等于单点加,子树和。
-
不好处理的区间询问考虑离线扫描线或者可持久化数据结构。
-
区间,树链询问有可减性时考虑差分。
-
对于只合并,不分裂的东西,考虑启发式暴力合并。
-
流题建模时注意费用流先保证最大流,要检查建出的模型是否符合该性质。
-
若 \(a \oplus b=c\),\(a\) 中有 \(x\) 位为 \(1\),\(b\) 中有 \(y\) 位为 \(1\),\(c\) 中有 \(z\) 位为 \(1\),则 \(x+y\equiv z(\mod 2)\)。
-
dijkstra 跑 \(n\) 次最短路可以直接记 \(d_{i,j}\) 表示 \(i\) 到 \(j\) 的最短路,堆中存二元组。
-
离线卡空间。特别是分块和根号分治,前者因为根号个区间的特性可以暴力扫描序列维,统计每一块和每一个询问的关系,大大减小时空常熟。序列上值域的根分如果需要存很多小块的贡献空间可能到 \(\mathcal O(n\sqrt n)\),可以离线小的值统一处理。
-
记 \(lca\) 为淀粉树上 \((u,v)\) 的 LCA,则原树上 \(dis(u,v)=dis(u,lca)+dis(lca,v)\),即淀粉树上 \((u,v)\) 的 LCA 原树上在 \((u,v)\) 路径间。
-
左偏树高没有保证。
-
正难则反,正算困难可以考虑容斥的思想,用总方案数减去不合法数。
-
换维扫描线。
-
有效取模最多进行 \(\log V\) 次。
-
颜色区间相关考虑ODT,如果只有推平操作复杂度严格 \(\mathcal O(n)\)。
-
trie 上整体加 \(1\),低位存在前面可以做到 \(\mathcal O(\log V)\)。
-
树上邻域问题可以只存孩子对父亲的贡献,查询时加入父亲的贡献。
-
复杂限制或许可以用许多容易维护的必要条件刻画。
-
字符串题先考虑 hash 和 bitset 乱搞。
-
STable 暴力修改复杂度是 \(\mathcal O(n)\) 的,可以用来处理 \(n\) 次修改,\(n\sqrt n\) 次询问区间 RMQ 的情况(分块,块内维护前后缀,块间 STable 维护)。
-
淀粉树高是 \(\mathcal O(\log n)\) 级别,思考普通树上跑不动的暴力。
-
\(20\) 以内数据范围:状压,数数题额外考虑容斥(感觉本质还是 DP,只是进行了类似 FWT 之类的操作合并的时候复杂度更优秀)。
-
矩阵树定理:外向树对角线存入度,内向树对角线存出度。
-
有向图欧拉回路个数: \(T\prod (deg_i-1)!\) 其中 \(T\) 为内向生成树个数。
-
\(E(x^2)\ne E(x)^2\)。期望没有这种性质。
-
平面图最小割可以转化为对偶图最短路。
-
常熟大的实数乘法可以取 \(\log\) 转成加法。
-
树上数数的套路:点边转化。
-
SAM 数组本体点数开 \(2\) 倍,其他数组也要开 \(2\) 倍!
-
SAM 沿着 \(\text{link}\) 向上走是在前面删字符。
-
静态问题主动分治。
-
\(\sum_{p}\prod_{i=1}^n[p_i\leq a_i]=\prod_{i=1}^n a_i-i+1(\forall 1\leq i<n,a_i\leq a_{i+1})\)。
-
二分图边染色最小值需要 \(maxdeg\) 种颜色,构造使用调整法。