反悔贪心

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\):情况二的临时答案(不满足限制)。

posted @ 2024-10-25 15:44  xishanmeigao  阅读(29)  评论(0)    收藏  举报