贪心思想
总结:玄学。
排序贪心
两种题型:
- 构造序列,最小化某个式子的值
- 感性地贪心取。
- 例如 \(a_i<a_{i+1}\),\(b_i\) 是一个排列,最小化 \(\sum a_ib_i\)。
- 取 \(b_i=n-i+1\)。
- 重排序列,最小化某个式子的值
- 整理原式,抵消贡献,再贪心。
- 阿狸和桃子的游戏,[THUPC2023] 大富翁
- 交换法,记 \(\text{cmp}(i,j)\) 为考虑 \(i\) 在 \(j\) 前面和后面哪个更优。
- 皇后游戏
- [USACO23FEB] Fertilizing Pastures G,此时只需要考虑 \(i,j\) 两者之间的贡献
- 通过人类智慧满足 Strict Weak Ordering。
- 皇后游戏
- 整理原式,抵消贡献,再贪心。
排序法则 Strict Weak Ordering
定义 \(x=y\) 成立(incomparable)当且仅当 \(x<y\) 和 \(y<x\) 均不成立。
- 对于 \(x\in S\),不存在 \(x<x\)(非自反性,基本条件)
- 对于 \(x,y\in S\),\(x<y\),不存在 \(y<x\)(非对称性,基本条件)
- 对于 \(x,y,z\in S\),\(x<y,y<z\),有 \(x<z\)(传递性)
- 对于 \(x,y,z\in S\),\(x=y,y=z\) 那么 \(x=z\)(不可比性的传递性)
事实上可以由 \(1\) 和 \(3\) 推出 \(2\)。
\(1,2\) 是运算符的基本条件,额外满足 \(3\) 即可排序,使用 std:sort
还需满足 \(4\)。排序时需要注意是否稳定。
扩展贪心 / 前 \(\bm k\) 大问题
构造方案使得所有状态形成一棵树,父节点比儿子节点优先级更高,且每个结点度数 \(O(1)\) 级别。此时即可按堆扩展。
这种往往使用可持久化数据结构维护。
这种前 \(k\) 大问题,要么贪心,要么二分。
P2048 [NOI2010] 超级钢琴 / P5283 [十二省联考 2019] 异或粽子 / 前 \(\bm k\) 大区间和
维护左端点,找到最大值所在的右端点。从堆中取出最优值,将最大值所在的右端点两边扩展入堆,或者直接求 \(k\) 小值。
\(\bm k\) 短路
维护非最短路树上的边,加边扩展。
注意 简单路径 只能二分做。
P6646 [CCO2020] Shopping Plans
反悔贪心
模拟费用流。