反悔贪心
P2107 小Z的AK计划
建议直接暴力,路上取 max 即可。
想太复杂了,WA 了一个点。
P1484 种树
经典题。
明明已经跟时间无关了不知道我为啥还硬要从左到右枚举。
考虑先取出最大的,再反悔。设位置为 \(i\)。
如果要取 \(a_{i-1},a_{i+1}\),那肯定是同时取,所以可以直接将 \(a_{i-1},a_i,a_{i+1}\) 从堆里删除,然后再插入 \(a_{i-1}+a_{i+1}-a_i\)。
具体实现可以用链表。
反思:不能先入为主;学习费用提前计算的技巧。
[AGC018C] Coins
一道经典的模拟费用流题目。
先强制每个人选一个种类,然后考虑反悔。
发现反悔只有 \(5\) 种类型。
a->b b->c c->a
a->c c->b b->a
a->c c->a
a->b b->a
b->c c->b
于是我们直接拿六个堆模拟这个过程。
为什么反悔贪心会比直接费用流快???
反悔次数是 \(\mathcal{O}(n)\) 次。
CF802O April Fools' Problem (hard)
可以建立费用流模型,隐约感觉是模拟费用流。
考虑这个费用流模型的本质是什么,其实是括号序列问题。
原问题的一种方案肯定可以对应一种合法括号串,记左括号为 \(-1\),右括号为 \(1\),构造一个长度为 \(n\) 的前缀和序列 \(s\)。现在我们放 \(k\) 次括号,要求括号序列合法,并且代价最小。
每次就两种方法,\(()\) 或者 \()(\)。
第一种简单,直接找 \(i\le j\) 且 \(a_i+b_j\) 最小的就好了,线段树很好维护。
第二种有特殊限制,要求左括号所在的位置 \(\forall k\in [i,j)\),\(s_k>0\)。
因为存在区间减法,维护 \(0\) 的位置是不方便的,所以我们转化一下,记 \(a_0=b_0=+\infty\),显然 \(s_0=0\)。于是我们转化成 \(s_k\) 必须满足大于最小值,这是比原先方便的。
对于区间 \([l,r]\),我们维护:
-
\(ma,mb\):\(a_{ma},b_{mb}\) 是区间 \([l,r]\) 的最小值。
-
\(mn\):\([l,r]\) 里 \(s\) 序列的最小值。
-
\(la,lb\):\([l,la),[lb,r]\) 是满足区间内所有的数都大于最小值的前后缀。且要求 \(a_{la},b_{lb}\) 最小。
-
\(va\):情况一的答案。
-
\(vb\):情况二的答案。
-
\(vc\):情况二的临时答案(不满足限制)。

浙公网安备 33010602011771号