Trick 整理
对于经常出现又难以独立发现的思维中间产物,如果系统性不够被称为知识,我们会称之为技巧、模型,或者”套路“。 ——zx2003
该笔记收录了一些,在写题过程中出现过的 trick。出现次数不够频繁而不能归入一般化的思维。但是又真切的存在于自身的神经网络中。
解释思维的方法,无非就是,要么分析性质,要么根据经验,要么灵光一闪吧。本文章旨在记录一些比较偏僻的经验。
通用
关注不变量
能离线的要离线
跳出动态过程(什么样的状态下),研究静态结构(存在什么):双栈序列
构造不出答案时,考虑维护答案。
考虑不同主体的贡献。
分类讨论(分治)
正序贪心难做,考虑倒序贪心(菜肴制作,ICPC睡觉)
先考虑下限,然后证明一定能到达下限。(构造单峰)
将决策顺序看作序列。(移动蓝球红球)
拆分贡献的时候,不要使用“事件触发”型贡献,把每个点剥离开来。(分段 mex 求最大和)
如果操作单点困难,考虑按照值域批次处理(构造单峰)。
想象状态空间,状态与状态的转移。
失败了不要慌张,思考最多失败多少次(最大三角形周长)
DP
具有阶段性考虑 DP。
决策集合具有单调增减性,可以优化。
数位DP,用mask表示0~9中哪些数出现过
小区间变到大区间——>区间DP。
计数DP 转移时考虑合法集合的具体样子。
状压 dp 转移时,如果顺序不影响,可以只考虑 lowbit。
双字符串想 dp
代价存在某种不对称性,即在前面用和在后面用,代价不一样。考虑贪心,正反dp。
证明 DP 正确性:
- 收敛形dp:归纳法做
- 刻画答案的样貌
图上游走考虑矩阵加速 DP。
定义状态时人为添加约束,前提是约束与题目大约束不冲突。(邦邦的大合唱站队)
单调栈退栈时做转移(CF1407D 跳跃大楼)
“质变点 + 不变段”的 DP:使用数学方法压缩不变段(添加逆序对 k)
子序列本质上是一种顺序约束,当顺序与题目无关时,就不需要考虑子序列的约束了(分段 mex 求最大总和)
正反 DP 枚举断点(f(A)表示连通块数量)
序列个数计数,考虑 DP。
真正会产生不同序列的位置,是不能被前面的序列所唯一确定的。(要/不要填mex的序列计数)
如果记录具体值行不通,尝试记录数量(要/不要填mex的序列计数)。
背包问题,涉及到多少种花费/价值,就往维度上放多少种。
排列计数 DP,如果约束只关注相对大小(最大值,大于),则状态也只考虑相对大小。
图论
- 虚点,超级源点,超级汇点
- 点的状态很少考虑分层图
- 染色:找出主体的不同状态,用边表示状态的异同。
- 二分图完美匹配 & 替换边:交替环
- DAG 从入度为 0 的点出发 dfs 能到达图上所有点。
- 构造序列,交替出现,构造二分图跑欧拉路径。
- 特殊图:
- 树形结构
- 完全图:输入量很少
- 连通性:并查集、搜索树
- 可行性:并查集、二分图染色
- 有向图:缩点
- topo 最小顺序:正着原图字典序 or 反着反图字典序
- 瓶颈路考虑 MST。
- 删边,离线做并查集加边。
树
- 子树查询考虑 dfs 序
- MST:
- 一般使用 kruskal
- 完全图、稠密图、通过公式生成边权,使用 Prim
图论建模
图论建模的时候,如果发现把 x 当作点,y 当作边难做,可以尝试把 y 当作点,x 当作边。
什么时候考虑图论建模?
二元关键字:数对 (a,b)
- 将 a、b 看作两个点,(a,b) 表示这两个点之间有边相连(CF2110E、单词接龙)
- 将 (a,b) 本身看作一个点
出现与图论结构相似的代数结构时考虑建模:
- 树的结构:只有一个父亲 —> 每个点只能被淘汰一次(选两个删一个);n - 1 条边 —> n - 1 个二元关系
- 边权结构:f(u) = f(v) + w —> 状态之间的转移代价
- 最短路结构:三角不等式
- 二分图结构:两种选择、奇偶性、见 2 思二分图
- 并查集:同一类、一种关系(食物链)
偏序关系:大于小于、放入、移动、嵌套
排列建图成多个不交环。
保留关键点优化建图
同余最短路:本质是通过取模来缩小状态空间,或者约束本身带有取模性质。关键词:无限次。常见形式:d[i]:mod x = i 的最小数(牛场围栏/类货币系统/跳楼机)
树上问题
- 算贡献,将贡献拆到 边 or 点 上
- 匹配问题,两个贪心方向:
- 尽量在子树内完成匹配
- 尽量不要与子树内的匹配
区间相关
经典例题
看到区间问题,就想到排序!!!
按右端点排序:
- 区间最少选点:CSP-S 2024 T2,维护上一个点的位置
- 最大不相交区间:会议安排,维护上一个区间的右端点
按左端点排序:
- 区间最少分组:廊桥分配,维护每个组的右端点
- 最少区间覆盖:维护 nxt 数组,下一个跳到的位置。可以不是覆盖成一个区间,多个点也可以:P4064 加法
- 区间合并:将相交的区间合并。维护当前区间。
以上问题都可以倍增优化。
经典形式
- 区间计数/最优区间:枚举端点,另一端考虑双指针、二分
- 区间修改:将操作映射到差分数组上(konbi 01序列问题)
线段树
- 考虑节点与节点、节点与标签、标签与标签之间的合并。
- 考虑节点与节点的合并时,分类讨论至少两种情况,答案落在左/右区间,答案跨越左右区间。
- 遇到难维护的操作,考虑操作最多能进行多少次。区间每个数取模/开方,最多进行 log 次。
- 若维护的信息没做过,有两种方法:
- 拆分成好维护的
- 直接研究操作影响
二分答案
- 处理 子段和/平均值/01分数规划 问题时要想到二分答案
- 最大值最小/最小值最大 考虑二分答案
- 单调性 考虑二分答案
- 寻找第 k 大,考虑二分答案:2026.8.19深圳模拟赛 T1
数学
- 值域取模裂成两类小值域。
- 有效取模最多进行 log 次
- 多重集排列数:n! / (相同字符出现次数! 之积)
- 整除 = 取模后为 0
数形结合
- 数对,不同属性之间比较:区间相交/并
- 数对,相同属性之间比较:二维平面
贪心
临项交换
交换论证
S1:断言存在一个最优解,符合某种结构。
S2:找到一个任意的最优解,找到它与结构矛盾的地方,调整。
S3:若调整后不劣,且调整的次数有限,证明成立。
解集是决策的集合。
常见技巧:分组、找到第一个不满足的地方
- 批量按值层处理,而非按位置拆贡献:(假山拍照,构造单峰)
反悔贪心
一种思想,非常灵活。通常由三个部分组成:
- 历史决策集合
- 替换时机(发现更优/不满足限制)
- 替换规则(替换的代价/价值是多少)
常见特征是,有一个很自然很平凡的贪心,会带来一些问题,此时不要放弃,尝试反悔贪心来调整。思维的出发点是朴素贪心。
常见应用:股票买卖、选了它就不能选它的互斥选择、分队
mex
- 序列拆分,求最大 mex 总和:累加出现次数的前缀最小值。
- 刻画mex时,想象一个格子条,mex就是这个格子条里,最左侧的,未标记的格子。
序列
- 构造一个严格增序列 {a1,a2…ai},等价于构造一个不严格增序列 a{a1,a2+1,…ai+(i-1)}.
- 将操作顺序视作序列。
- 严格增 or 不严格增的约束,可以通过操作差分序列来解耦。
- 生成任意序列,意味着可以改变序列的每一项而不影响其他项(konbi 01序列问题)
杂项
股票买卖经典转化之,“i 买 k 卖 = i 买 j 卖 j 买 k 卖”。
括号序列经典性质之,“一个括号序列合法,当且仅当在任何时刻,左括号数量 >= 右括号数量,且整体数量相等”
拼数:按 A+B 和 B+A 的大小排序,可以证明构成偏序
字典序相关构造:枚举每一位,考虑这一位填什么(逆序对为 x 的字典序第 k 小排列)
字典序考虑贪心。
对角线相关:研究 x+y,x-y 的奇偶性、不变性。(V 填色)
- x-y 不变:处于同一主对角线上(充要)
- x+y 不变:处于同一副对角线上(充要)
- V 字型上 x-y / x+y 的奇偶性相同
满二叉:叶子交换到最左边所需要的边数,等价于它编号中 1 的个数(中/后缀最小字典序)