贪心与构造
贪心
排除不优策略
Example1(CF1612E)
先把期望写开,我们发现如果选择了
但是,如果
于是复杂度
Example2(CF1592F1)
首先,二操作和三操作一定没有用,因为它们都可以用两次一操作代替.
再注意到四操作是可能有用的,因为我们拿一操作模拟四操作需要四金币的代价,而用一个四操作只需要三个金币.但是,由于拿一操作模拟四操作的时候,需要全局做一遍一操作,所以如果有两个四操作,模拟的时候两遍全局操作就可以抵消.因此,我们模拟两次四操作只需要六个金币的代价.换句话说,我们如果要用到四操作,只会使用一次或零次.
首先区间异或可以差分(
枚举一下最后的操作是啥即可,另外注意到这一步操作必须把四个点全部变成
Example3(CF1592F2)
首先注意到,如果我们对
再通过上面的分析,注意到只有
因此我们现在想要选尽可能多的三操作,满足两两操作不在同一行或同一列,这显然是一个二分图匹配问题.换句话说,如果
Example4(CF1666E)
先想一下别的东西怎么求.
如果我们要求最大值最小或者最小值最大怎么办?我们可以二分后贪心,而显然它们的差就是一个答案的下界,问题在于这个下界是否可以取到.
我们冷静一下,发现在可能的方案中,第
设
注意到
为啥呢?只需让
Example5(2022zrtg十连测day7 Palindrome)
首先注意到同种字符的相对顺序不可能改变.于是最后的回文串是哪个字符对应哪个字符就可以确定.
这样我们的问题转化为现在有若干个点对
接下来讨论一下两个点对
Example6(23省选10连测 day9 C)
强强题.
首先发现这个
那
再考虑,我们会让哪个
于是就做完了.
Example7(异或粽子)
Example8()
带悔贪心
Example1
给定一个数组,给出若干次操作
这题的做法是,我们每次遇到一个左端点,就将所有以它为左端点的区间全部操作,并把这些区间按照右端点为关键字扔进堆里.每次遇到一个地方的值变成了负的,就从堆中找右端点最大的区间杀掉.容易发现这样是正确的.
为啥能想到带悔贪心呢?主要是因为我们发现不同的区间会彼此影响,而且有一个限制性的长期条件.因此先不管这个条件,最后再通过调整堆将这个条件调整至合法.
Example2
给定一个序列,每次可以选择相邻的两个数,使其中一个
我们明确一下带悔贪心的基本条件:
-
首先,贪心是需要保证局部最优性的,并且需要保证不考虑全局的前提下,求局部最优解就是全局最优解的一部分.按我的理解,贪心是和dp一样需要有无后效性的,你前面的决策做了就是做了,带悔贪心只能改变后面的决策的形态,而不能改变前面的决策.
-
不同的操作之间会彼此影响,并且我们在不看全局的状态的前提下,无法第一时间确定当前对后面最优影响的操作是啥.通常情况下,感觉带悔贪心的每个操作会影响的操作是有限的.
-
感觉能做带悔贪心的好像很多都可以设计一个复杂度更高的dp.不过这个似乎很合理,因为(2)告诉我们它能影响的操作大概率是不多的.
我们看这个题,第一点基本随便编个贪心都可以满足:就是先不断做
那么为什么能想到带悔贪心呢?其实只要发现有的时候
好,现在我们仍然是做那个看上去就不太对的贪心:先不断做
但是,我们直接认为
先看第一个问题:
再看第二个问题:这个新操作为何能反悔呢?其实第一个问题解决这个问题也就解决了,由于贪心,我们知道了巨大多的信息,这个信息量是dp不能比的.因此这个条件如果dp的话看上去需要多记一维,但是贪心完全不用.
我们可以根据类似上面的操作迅速编出它怎么反悔:
最后遇到一个点,能用
再总结一下这个题中包含的带悔贪心:
这个带悔贪心包含若干个操作,这些操作之间可以互相转化,使得在前面进行的一个操作可以和在后面进行的一个操作一起,等价于前面进行了另一个操作.如同最经典的带悔贪心的模型,我们每次进行一个操作后,都会加入若干个可以进行的操作(在这个题中,一开始就在每个位置加入了无穷多的
寻找下界并证明
Example1([EER1]代价)
给你一个长度为
首先注意到,如果有一个
再思考一个事实:当
Example2(loj3318)
首先考虑:给出一个排列,从原排列换到它的最小步数一定是它的逆序对数.因为我们可以每次找到应当被放到边界的点,然后不断把它换过去.
考虑现在构造
Example3
给定一张图,每个点上有一个权值
首先注意到答案一共要更新边数次,不妨考虑边.
一条边可能对答案有两种贡献,也就是与它相邻的两个点的点权.它会对答案贡献后删的那个点的点权.显然所有边取最小值时是一个下界.这个下界是可以构造出来的:我们按照点权从大往小删即可.
Example4([UOJ280]题目难度排序)
先考虑
那如果可能存在
首先这么做一定是合法解,因为中位数会在
Example5([CF1098D]Eels)
首先,我们猜测:我们一开始先让最小的两个互相吃,可能是最优秀的.接下来我们尝试证明这个猜测.
首先,对于一个不危险的操作来说,假设这次操作的两个数是
我们按照鱼的重量从小到大排序,你会发现一次不危险操作涉及到的鱼一定是一条满足自己大于比自己小的所有鱼的重量和的两倍的鱼,我们称其为大鱼,也就是
那么问题又来了,这个东西一定是最小的吗?
我们考虑一个事实:我们要最小化不危险操作的数量,但很明显的一点是:每只大鱼都必须经过一次不危险操作才能变成一只更大的鱼,当然,如果它选择自杀,那么吃掉它的那只鱼会继承它的地位,在不死的情况下仍然要进行至少一次不危险操作才能变成更大的鱼,因此这显然是一个下界.而又可以构造出答案.
那么如何多组询问呢?首先发现大鱼不会很多,最多
Example6(称球游戏)
给定
我们通过这个游戏来引入信息论和判定树作为一个构造下界的工具.
首先引入一套语言体系来简化文字:
-
表示标准球. -
表示称量集合 和集合 , 表示平衡, 表示 较重, 表示 较重.
信息论
如果一个随机变量
定理1:在得到关于随机变量
定理2:当一个随机变量的各种取值概率相等时,它的熵最大.
用信息论估计一下称球游戏的上界,如果我们已知次品轻重,由于一共有
这就是称球游戏的信息论下界,接下来我们要做的无非就是证明这个下界能否取得到.
判定树
我们考虑将称量的决策树建立出来,每个叶子节点表示我们得到的答案,每个非叶子节点代表一次称量,每个非叶子节点有三个儿子,分别表示如果称量的结果是左偏/右偏/平衡时,接下来的策略.显然判定树的深度就是最坏情况下称量的次数.
子问题1(已知次品重量)
不妨假设
根据信息论,
首先考虑证明
子问题2(不知次品轻重,已有一个标准球,需知道次品轻重)
根据信息论下界,
比起上面的问题,这个问题在于:如果我们称量不平衡,是不知道次品球在两堆中的哪一堆的.但我们思考到:虽然我们不知道在哪一堆,但我们得到了一个额外的信息:如果它在哪一堆,它的重量我们也就知道了.
下面证明引理:
引理
有两堆球,第一堆有
先证明信息论下界,不难发现仍然是
首先不难发现,
仍然使用数学归纳,假设
情况1
若
接下来称量
-
如果
,那么答案在 中,此时有 . -
如果
,由于若次品在 中,那么它不可能是重球,因此次品不可能在 中,同理不可能在 中,只可能在 中,此时有 . -
,同理.
此时数学归纳成立.
情况2
同理,当
由此引理得证.
回到原问题,进行数学归纳,我们继续来讨论
情况1
当
情况2
当
剩下的情况也都类似,该问题解决.
子问题3(不知次品轻重,无标准球,需知道次品轻重)
考虑在第一次称量后,无论结果如何都会得到一个标准球,因此后面的问题都等价于子问题2,只需考虑第一次操作.再思考一下不难发现,在子问题2中,只有
子问题4(不知次品轻重,已有一个标准球,无需知道次品轻重)
这个问题复杂一些,而且难以估计下界.但我们可以用一下最优化dp来估计下界.
首先假设有无穷个标准球,我们每次将
-
如果天平不平衡,转化为引理问题(因为此时找到次品是谁必然知道它的轻重),因此需要
步. -
如果天平平衡,需要
步.
我们有
注意到接下来的步数只与
构造方程后手算几项,注意到
接下来归纳法就简单了,只需要对于
Example7(Ucup 3rd Stage 8 H)
每次可以询问一个区间,交互库返回这个区间中的次大元素所在位置,求
一个自然的想法是先问一下全局次大值,然后二分,但这样询问区间总长度就会爆掉.
因此考虑设
那么我们当然有方程
当然有
Exchange Arguments
模型1
给定
事实上会发现一些NPC问题也可以直接转化为这个模型,但是并无贪心解.我们接下来考虑这个模型内哪些问题是有贪心解的.
Example1(国王游戏)
给定
转化为上面的形式,也即:
考虑调整法,令排列
因而如果
如果一个
我以前所使用的调整法大概是先构造一个贪心策略,然后证明这个策略改变后一定不优秀或更劣.但是这样对于多峰函数会卡在一个局部最优解上而找不到全局最优解.但是,如果我们说不满足这个条件的一定不是最优解(可以使用调整得到更优解),我们再证明满足这个条件(即调整过程DAG的终止点)的都是最优解,继续做下去,就是很严谨的.
换句话说,我们要用调整法,就一定要证明调整过程中的DAG的零出度点是最优解.
模型通解
设给出的元素的集合为
-
强完全性:
, . -
传递性:
, . -
,如果 ,则对于任意一个包含 作为子段的元素序列 和 都有: .
问题满足以上性质,那么我们按照这种二元比较关系对元素排序后的答案一定是最优的.原因在于,首先这种操作构成DAG,而定义
分析题目时,应该先分析第三条性质得到
Example2
给定
令
此时我们注意到:
于是这题可以使用后缀数组求任意两个字符串的后缀的最长公共前缀实现.
Example3
有
考虑最大化
我们令
我们接下来将证明所有形如这样的题的通法.
首先,定义
对于性质(3),显然成立,因为交换两个相邻位置不会对前面或后面产生影响,而前后对于这两个位置的影响也都可以抵消.
性质(1)显然成立.
再分析一下这个式子,这相当于不等式左边的两个元素都大于等于右边的最小值.我们讨论一下两种情况:
-
都大于等于第一个元素,则相当于
. -
都大于等于第二个元素,则相当于
.
可能这里后面和
注意到需要对
-
若
,则不等式成立. -
若
,则不等式成立当且仅当 . -
若
,则不等式成立. -
若
,则不等式成立当且仅当 .
这四条中(2)和(4)的证明是显然的,(3)则是因为此时
由此发现,对于
但是不同类之间并没有满足传递性,因此我们把排序条件修正为:
模型2
给定
如果
Example
有
-
第一个人要么选择一个物品,付出
的代价;要么选择结束游戏. -
第二个人可以选择删除这个物品,这会使博弈回到第一步,且第一个人付出的代价不会消失(这个操作最多可以进行
次);也可以选择不操作,此时第一个人获得 的收益,博弈结束. -
第一个人的总收益为收益减去付出的所有代价,第一个人希望最大化收益,第二个人希望最小化收益.
注意到第一个人要么一开始就结束游戏,要么连续选择
构造
增量构造
Example1
平面上有
考虑数学归纳,现在已经有
Example2
给定若干个角度
首先有解条件显然是判定它们的和是否是
注意到相邻的
Example3(CF1770H)
呃,简单来说就是把边界往里缩,每次找左上和右上的四个点做匹配,然后剩下的缩进去.
原题解的那个图特别清晰.
Example4(ABC232H)
放在这个模块下就好想了,剥一行一列就行.最后可能会剩个边界情况,简单讨论.
找中间状态
常见于操作可逆,想要让
Example1
坐标系上每个整点有个灯,初始只有
首先我们发现,如果我们上面有若干个亮点,我们一定能把他们全杀了,变到下面,但下面的亮点没办法处理.怎么办呢?
一个想法是,我们将所有的亮点全都推到一条直线
这个题有个改版,
这个题怎么做呢?类似上面的,我们考虑找到两个点
如果我们随便找一个点
那么怎么找到这个点呢?我们二分,每次判断一个区间
评论