trick合集
杂项
-
对一一个一维问题,我们可以考虑枚举分割点,然后通过合并分割点两边的数据来计算答案
-
对于构造方案,排列。可以尝试按照有/无规则随便构造一个,然后把这个构造向合法的构造修改靠拢
-
对于线段/区间问题,我们可以考虑对区间/线段排序. 同时我们可以考虑按照排序决策.但是排序顺序与决策顺序不一定一样,可能不一样
-
对于一个一维线性问题,我们可以将其转化为前缀和/差分的问题. 然后通过图论建模等方式解决
构造
- 少量元素生成大量结果->存在一种稳定、可预测的组合规则,使目标结果可以被结构化地编码出来。
例题: construct
- 在操作,变换的题目中,我们可以尝试发掘不变的量,可以是量本身,也可以是量关于取模的结果;对于不变量的发掘,
可以从多个角度.例如从相同性质/类型中挖掘,或者从一个具体的数据的操作和变换中发掘
例题:CF2237D Fullmetal Bitchemist
贪心
-
思考:改变这个选择会使什么东西变坏?以及变坏必须满足什么条件?
-
思考在部分情况下,为什么某些贪心会成立. 最好分析是数学语言化的,因为这更容易触碰到贪心的本质
-
我们分析,更多要聚焦于我们有什么性质,因为这可以利用.而不是我们没有什么情况,因为这只是问题,没有价值
eg:“这个条件具体保证了什么,而我的算法又恰好需要什么保证?”
-
寻找简单情况与一般情况的差异
-
考虑按照最显然的没有限制的情况贪心,然后向有限制的情况靠拢
数位
- 按照数位考虑.当要求构造的结构与数相关的时候.可以把我们构造的数,或者目标的数按照数位来拆解,可以一个数位一组,也可以多个数位一组.
例题: construct
状态设计
状态是我们用于分步计算和转移的工具
- 我们在设计状态的时候,可以抛弃一些信息.哪怕这回导致错误的计算,但是必须保证最终,正确的答案总会把错误的计算挤走.
图论
性质挖掘
图论问题的性质挖掘非常重要,所以我单独开一个
-
我们在研究图论问题时,我们可以考虑构造类似环,链的特殊结构来寻找性质. 哪怕这不是题目本身需要的
-
我们在研究图上的路径问题时,可以考虑对路径取反,即\(s \to t\)变成\(t \to s\),来挖掘性质
-
我们可以对图的度数来分析性质
-
我们在研究性质的时候,我们可以对图的点进行分类
-
我们考虑通过发现的信息是否可以构造环,环有什么特点.
-
我们可以对结构取逆来分析
-
对于图论建模题目,我们考虑每个点,每个边都是怎么产生的?它连接哪些点?度数由什么决定?
-
连通块可能是什么?
其他
-
把边的问题和点的问题相互转化是常见的trick
-
对于树上多个点的问题,我们可以将其拆为单个点的问题,然后在不同的点之间移动
-
对于树上问题,如果没有思路,可以尝试分析直径,中心,重心,来解决
动态规划
-
我们可以使用辅助的数组来优化动态规划
-
dp有的时候可以逆着来
去重
- 给每个方案/转移 制定一个独特的选择/代表
对于每个合法方案,指定一个唯一的元素作为它的代表,使得每个方案只会被统计一次。
常见的代表元素:
- 最小/大元素/匹配/操作;
- 最左/右边的元素/匹配/操作;
- 最后加入的元素/匹配/操作;
- 固定的匹配/操作
- 强制规定操作顺序
如果一个方案可以通过多种操作顺序实现,那么规定一个规范顺序。
这个顺序的规范可以是状态内所有的规范,也可以是对于特地元素例如最后一个,第一个元素的限制
-
划分成互斥情况
-
按照最后一次操作分类
不同的转移变量/状态 给不同的最后一次操作
- 规范化表示
有时同一个对象存在多种表示方法。
例如一个无向图中的一条边:
如果直接枚举两个端点,会统计两次。
规定:
就可以唯一表示这条边。
更复杂的情况:
- 无向路径规定从较小端点开始;
- 无根树规定某个特定节点作为根;
- 环规定从最小编号节点开始,并规定方向;
- 集合规定按照递增顺序表示。
这实际上是在给等价的表示方式选择一个标准代表。
- 先计数,再除以对称性/重复计算数量
状态设计
-
可以考虑记录最大值和次大值这样的来实现状态的压缩
-
记录状态的边界信息
有些题目处理一个区间时,未来会关心这个区间的边界。
例如:
其中最后一维表示区间左端点是否被选择。
组合计数
- 在组合计数题目中,我们可以通过固定状态(枚举),来简化问题. 例如不相交的区间数量可以先固定一个区间,看有哪些区间与这个区间不相交.

浙公网安备 33010602011771号