常用 trick 记录
提取了白玲女子学院图书部测试当中出现的一些我可能没完全掌握的 trick。
做题策略
- 如果认为一个题会有很多 corner case。获得 WA 之后应该马上写对拍。
- 对于 YES/NO 问题,有些时候可能不能直接找若干个简单的判定模式 \(P_1(),P_2(),...\),有些时候可能有深刻的判断模式。尝试去推一些性质,或者编一点贪心。(教训:Monosaba Contest #2 P1, EUC 2024 Problem H)
- 对于最优化问题,如果一种模型转化做不出来。尝试用其他方式建模(教训:NOIP2025)
- 前三个小时要均匀的思考每个题,最后两个小时开始尽量多得分(优先选分少的)。
思考方向
- 如果题目要求在某个特殊的图上做某类问题,看着复杂度像是 \(poly\)。尝试现在一般图上做,假设 dp 数组是 \(f_{*,S}\),\(*\) 是 \(poly\) 个状态。尝试分析 \(S\) 的大小,可能不太大。
- 对于操作类问题,尝试考虑设计势能。最好来说对每个元素要是独立的。
- 对于求第 \(k\) 大的 \(x\),\(f(x)\) 满足某条件。如果 \(f(x)\) 是递增的,直接求第 \(k\) 大的 \(f(x)\) 再回来求 \(f^{-1}(x)\)。
- 打表,要逐步满足表的条件。最好是,不断找出条件 \(P(x)\),使得满足 \(P(x)\) 的肯定是 NO(或者 YES,最好只考虑一边)。如果大的拍不出来,小的会挂,考虑是 corner case。
- 求 \(x\) 的数目满足 \(f(x)\) 是偶数的题。要写成 \(\sum 1^{f(x)}+(-1)^{f(x)}\)。
- 不增数组的单项挪动操作,可以看成数轴上 \(n\) 个点不跨过彼此的移动。即可以使用 LGV。
- 对于一类《每个点两条出边,一个棋子,每次经过一个点走向第一条出边,然后两条出边顺序交换》类型的问题,可以通过势能分析发现最终的步数是当前指向第二条出边的点的点权之和(即每个点的贡献独立),前提:这个状态是可达的。
- 对于多次询问,给定 \(x\) 问类似 \(\min f(x,i,j)\) 之类的问题。如果 \(j\) 可以通过其他方式优化掉(如凸包等),\(i\) 式子上比较复杂。则去思考可能的 \(i\) 是否比较少,分析可能的 \(i\) 是哪些。
优化技巧
- 如果对一个式子完全没有化简的想法,尝试观察某项是否能写成多项式。并使用拉格朗日插值。
- 如果下标很大,dp 数组的值很小,且 dp 具有偏序性。尝试交换值和下标。
一般结论
- 对于求某个最值的问题,如果我们可以很快比较一个区间内两个值的大小,但是后续加入的元素可能对前面的大小关系产生影响。可以尝试维护可能成为最大值的元素。也许这样的元素很少。
- 一个串 \(S\),后缀 \(S[i,n]\) 满足存在 \(T\) 使得 \(S[i,n]+T\) 是最小的的 \(i\) 只有 \(\log\) 个,且后一个至少是前一个的两倍。
- \(01\) 矩阵 \(M\) 的最大匹配,可以给每个 \(1\) 赋一个随机数,\(rank(M)\) 则是最大匹配。好处是,多个矩阵拼在一起,他们乘积的秩还是最大流。
- 长度为 \(2^n\) 的数组循环位移矩阵的 \(det\) 是 \(FFT\) 数组每项的积。

浙公网安备 33010602011771号