[div 2 C] tricks
内容说明
关于一些常见的 的
长期更新
想想出题人为什么这么出?
-
先从已经确定的部分开始考虑
-
先排除无效元素
-
定义操作 (约束) 和开销 / 收益, 要求最值化开销 / 收益
- 将约束条件数学化
- 模拟操作情况, 贪心处理最好开销 (将简单情况先处理, 然后在基础上处理最值 / 简化操作)
- 考虑操作对答案的影响 (推式子) , 据此对操作进行处理
- 推导每个元素对答案的贡献 \((\)拆贡献\()\)
- 推导动态规划
- 判断是否存在操作满足约束
- 模拟, 对于重复情况去重
- 要求一个数列的多个部分 \((\)前缀, 子串 \(\cdots\)\()\) 的成本
- 贪心找到最优操作的构造方法, 加上优化 / 找共同点
- 找到所有情况统一的构造方案
- 然后逐操作贪心
- 枚举开销所需要的一个值\((\)超过 \(x\) / 不大于 \(x\) / 和小于 \(x\) 中的 \(x\)\()\) , 然后考虑对于这个值进行贪心
- 先找到一组简单的合法解, 然后在基础上进行调整, 使其花销更优
-
定义合法情况, 要求输出一组合法情况 / 合法情况的最值问题 / 求方案数
- 模拟操作情况, 找到最好开销, 注意最大和最小
- 列出合法情况需要满足的表达式, 在原序列中贪心选择最优情况
- 构造: 先推性质, 不行打表
- 找到不合法情况在什么时候出现, 通过对不合法情况的转化构造最优的合法情况
- 往往利用 \(\rm{dp}\) , 结合约束处理当前方案
- 先找到一组合法解, 然后在基础上进行调整
-
定义操作, 要求把 \(a \to b\)
- 逆向思维, 把 \(b\) 拆成 \(a\)
- 用 \(\rm{STL}\) 维护
- 考虑操作是否能构造出单位操作, 在用单位操作的性质去做题 \((\)一般是到了哪里就不能操作了\()\)
- 打印操作方法
- 考虑一种构造策略
- 约束仅存在于操作顺序/每个元素的状态上
- 考虑对约束顺序/状态建图判环
- 逆向思维, 把 \(b\) 拆成 \(a\)
-
逆向思维
- 只要结果确定, 完全可以考虑倒推
-
不动点 + 动点交换
- 在不动点之间的部分找构造方式
-
奇偶类问题
- \(\Delta = 1\)
直接记录 - \(\Delta = 1\)
- 贪心的下传 \(> 2\) 的部分
- \(\Delta = 1\)
-
乱搞
- 数据范围小
- 答案范围小
枚举每次操作, 剪枝
-
括号序列
- 转化成 \(1, -1\)
- 使用括号树
- 用 \(ans, cnt\) 计算合法括号串数量
之前的 \(ans\) 和最外层括号的数量 \(cnt\) - 利用分层特性
- 用 \(ans, cnt\) 计算合法括号串数量
-
博弈
- 有平局先处理平局
- 考虑操作的本质, 最终可以怎么样, 然后确定答案 (简单博弈)
- 考虑先手可以怎样控制后手的选择\((\)选择位置下标的奇偶性\()\), 然后讨论是否有必胜策略
- 讨论总长度的奇偶性
- 先手控制后手
- 先手跟随后手 / 后手跟随先手
- 区间问题考虑 \(\rm{dp}\)
-
字符序列
- 回文问题
- 模拟操作情况, 贪心找到最好开销
- 回文问题
-
交换相邻元素性质
- 从 \(a\) 到 \(b\) , 交换 \(|a - b|\) 次
- 对于两个串的定位问题, 每个元素定位的花费就是关于其的逆序对个数
证明: 从大权值到小权值, 逐个固定位置 - 往往用固定之前的部分, 移动当前的部分来解决
-
子序列类问题
- 对于涉及到 \(1, -1\) 的问题, 善于通过 \(\Delta\) 和前缀后缀来解决
-
从 \(a \to b\) , 定义固定操作, 求最初对 \(a\) 怎样操作使得 \(b\) 的某个性质最值化
- 找到贪心性质
-
点对问题
- 区间问题往往可以转化成点对问题
- 点对贡献维护, 类似扫描线的思路, 一维枚举
- 一维数据结构处理
- 往往可以通过之前计算过的 \(l\) 来继承, 类似 \(\rm{dp}\)
- 一般来说, \(L\) 从右往左, \(R\) 从左往右枚举
-
定义约束, 要求满足约束的原序列数
- 逆向思维
-
二进制相关问题
- 往往可以拆成每一位考虑 \((\)贪心\()\)
- 异或
- 注意结合律
-
动一个点要求计算每一个位置的答案
- 前后缀类拼接问题
- 预处理前后缀, 然后拼拼拼
- 区间包含数量问题
- 前后缀类拼接问题
-
费用提前计算可以省去一维
- 常见的模型: 时间叠加

浙公网安备 33010602011771号