1
题意:一张无向图
G,其中
i,j 间有连边当且仅当
ai+aj≥s,其中
s 是定值。求
G 的最大匹配。
直接从大到小贪心是对的,但是可以证明更强的结论。
考虑任取一排列
p1,…,pn,然后依次将
pi 和
aj≥s−api 的
aj 最小的
j(如果有)匹配。
反证,假设按照上述贪心策略得到的结果不是最优的。那么一定存在一个优于贪心策略的最优策略。那么考虑第一次按照贪心策略本应选择
u 和
v 匹配,而在最优策略中并没有选择将
u,v 匹配。两种情况:
- 没有匹配 u。将 u 和 v 匹配,并拆散 v 原有的匹配一定不劣。
- u 的匹配为 w1,aw1≥av。如果 v 没有匹配那么拆散 u,w1 重新匹配 u,v 是不劣的。否则设 v 的匹配为 w2。因为 aw2+av≥s,aw1≥av 因此 aw2+aw1≥s,将 u,v 匹配,w1,w2 匹配不劣。
我们就得到了一个不劣于最优策略的新策略。对新策略继续归纳,归纳到最后,就会得到贪心策略,因此贪心策略一定不劣于最优策略,与假设的存在比贪心策略更优的策略矛盾。
题意:还是一张无向图
G,
i,j 间有连边当且仅当
li+lj≤s≤ri+rj。求
G 的最大匹配。
按
li 从大到小排序贪心选择满足
lj≤s−li 且
rj≥s−ri 的最小
rj 匹配。
和例 1 的证法是一样的。假设
u,w1,
v,w2 各是一对匹配,证明一定可以调整成
u,v 和
w1,w2 各自匹配这样的形式。
lu+lw1≤s,
lw2≤lu,所以
lw1+lw2≤s。
rv+rw2≥s,又
rw1≥rv 所以
rw1+rw2≥s,得证。
(做法见题解区。)
证明:
f(L) 的贪心策略是最优的。
证明方法还是类似的。设在
i 处的 ? 可以改成 ( 而在最终策略中是 )。考虑最小的
i。找到
i 后面第一次操作的位置
j,将
i 改为 (,
j 改为 ),仍然满足条件且最低点只会更高。
证明:
f(L+2)≤f(L)+2。将
L+2 方案的第一个 ( 改成 ),就得到了一个
L 的方案。所以
f(L)≥f(L+2)−2。
证明将
a 从小到大排序之后,排成
c1c2...cn=ana1an−1a2… 是最优的。
假设排列成
b1b2...bn 更优。这里有一种神奇的调整方法。首先比较
b1 和
c1,若
b1=c1,由于
c1 是最大的,交换
b1 和
c1 在
b 中出现的位置一定合法。再比较
b2 和
c2,若
b2=c2,设
bp=c2。翻转
c[2,p] 这段区间一定合法。因为已经保证了
c1 最大,
cp 最小,所以
c2cp+1≤c1c2≤k,
c1cp≤c1c2≤k。以此类推直到
b=c。
证明自底向上贪心,将儿子子树内的段按照最大内存排序后儿子子树间按照顺序依次匹配是最优的。
不同于之前的证明思路,证明对于每个
c,按照贪心策略得到的
≥c 的段的个数都是最小的。归纳假设子树内都已经是最优的,那么设儿子子树内
≥c 的段分别有
d1,d2,...,dm 个。则显然有下界
max{d1,...,dm},而按照贪心策略恰好取到下界,故得证。
6
题意:求带限制的 DAG 拓扑序。即
lu≤pu≤ru,且对于
(u,v)∈E,
pu<pv。
注意到
lu≤pu 能推出
lu<pv,
pv≤rv⇒pu<rv。将
lv 对
lu+1 checkmax,
ru 对
rv−1 checkmin。然后跑
lu≤pu≤ru 的点与区间的贪心匹配。
证明这样是最优的。
充分性:
如果按照贪心策略得到的存在
(u,v)∈E,pu>pv。因为松弛过后的
lu<lv,ru<rv,根据贪心策略是不可能存在
pv 在
pu 之后被选这种情况的。(因为贪心顺序是按照
r 从小到大。)
比较综合的证明题。做法见题解区。
引理 1:
N=[(S−1)/2]。首先,考虑
x∈A 和
S−1−x∈A 不能同时成立,所以
N≤2S−1。当
A={[2S]+1,...,S−1} 时,
N≥[2S−1],所以
N=[2S−1]。
引理 2:当按照
贪心策略 确定了
A′⊆{1,...,[2S−1]},一定存在
A′⊆A。考虑
x∈/A′,将
S−1−x 加入
A′。显然
∣A′∣=N。设
a1,a2,...,ak∈A′ 且
a1+a2+...+ak=S,
ak>[2S−1],则
a1+a2+...+ak−1=S−ak,按照贪心策略
S−ak 本应已经加入
A′,与
ak∈A′ 矛盾。
后面的题是一些 cf round 的简单题,主要在证明,可以留作习题。
大多数是作者口胡内容,因此证明细节上可能会有疏漏。
显然我们只需要考虑所选的红色顶点是一个连通块的情况。因为如果不是,保留其中一个连通块一定不劣。
考虑树
T 一个叶子
u∈T。考虑所有包含了
u 的连通块
S,如果
S 也包含了
u 的父亲
v,
u,v 边权为
w,那么将
xu 尽可能多地转移到
xv 一定是不劣的。所以一定会使包含
u 的最大连通块恰好取到
k,解得
xu=max{0,k−w}。重复剥叶子的过程。
显然要先打
ci>0 的怪,最后打
ci=0 的怪。
考虑
ci>0 的怪,最优策略一定是按照
bi 从小到大逐个击败。因为如果不是,考虑交换相邻两个怪物
bi>bi+1。如果
bi 或
bi+1 中有一个怪没死,或打
bi 和
bi+1 使用的不是同一把剑,那么一定可以调整。如果打
bi 和
bi+1 使用的是同一把剑同样可以调整。
再考虑用哪一把剑去打
bi。显然用攻击力
≥bi 的攻击力最小的剑
e,得到
max(e,ci),f 是最优的,因为如果选择了另一把更大的剑
f,
f≥e,得到
e,max(f,ci),而
max(e,ci)≥e 且
f≥max(f,ci),
max(e,ci)≥max(f,ci) 且
f≥e 至少有一个成立。所以选择
e 比选择
f 是一定更优的。
考虑如何计算
f(b1,b2,...,bm)。设
bi=bi′2ci,其中
(2,bi′)=1。依次考虑
bm,bm−1,...,b1,选择
bi 后面最大的
bj,将
2ci 乘入
bj。考虑使用调整法来证明策略的最优性:首先,
bi 不会选择把自己的
2ci 乘进多个数里,因为若
x≤y,
0<a≤b,
x2a+y2b≤y2b+1≤x+y2a+b。若
x≤y,0<b<a,
x2a+y2b≤y2a+1≤x+y2a+b。
其次,如果
bi 把自己的
2ci 乘进了
bk,其中
bk<bj。根据上面的不等式,将所有在
i 及
i 之前乘进
bk 的数乘进
bj 里是不劣的。
设最初的数组是
ai,最终变成了
bi。
考虑最终
ai 的 or 包含哪些 bit。设
S 表示
ai 的 or,
T 表示
bi 的 or。考虑
i∈/S,j∈/S,如果
i∈T,j∈/T,
i∈bk,一定存在
ak≤t≤bk,j∈t,i∈/t,将
bi 调整为
t。显然代价不会变大,且
bi or 的 popcount 不会变小。因此考虑
T,一定形如
T=S∪{0,1,...,k} 或者
T=S。
枚举
k 之后,考虑怎么求出最小的代价。考虑第
i=k−1,...,0 位,如果说
bi 的 or 已经包含了第
i 位,则无需再操作,否则选择后
i 位最大的一个
bj 进位到
2i,并将后
i−1 位设成 0。
证明考虑使用归纳法。
假设只考虑
i 之前的二进制位已经是最优的,推出
i 也是最优的。
反证。设按照贪心策略选择的是
bj,而按照最优策略选择的是
bk。考虑调整,将
bj 第
i 位变成 1,
bk 第
i 位变成 0,同时交换
bj 和
bk 的后
i−1 位。显然仍然满足
bj≥aj,bk≥ak,且
∑x=1nbx 不变。所以最优策略一定会选择
bj,与假设矛盾。