CF720F

CF720F题解
本文解析了一道算法题目,目标是在给定数组中选取k个子段,使所有元素被覆盖且子段和最大。通过几个引理讨论了最优解的特性,并给出了解决方案。

题目描述

给定1≤n≤100000,1≤k≤n(n-1)/2,和〈a_1, ... ,a_n〉,其中-50000≤a_i≤50000, 要求选出k个不同的子段,使得每个元素都被这些子段覆盖且这k个子段和的和最大.

题解

Lemma 0. 对于每个未选择点加入的一定是两端扩展到最大的范围

这还用证明么..?因为加入的点存在未选择的那么加入的一定是未选择的,当然怎么大怎么好.

Lemma 1. 前min(k-n,0)大的子段一定在选择内

k≤n的情况显然是正确的, 考虑k>n.

Def. x=k-n 前p大子段被选择 pn个子段, 一定有两个子段重叠在前p大子段没有到达的地方(鸽笼).

Lemma 2. 非最优重叠在最优没有到达的地方不优

即部分选择[l1,r1][l2,r2](这两个选择都非最优,r1≤r2)包含两个最优未选择t1,t2,且l1≤t1,t2≤r1, l2≤t1,t2≤r2

那么l2≤r1,我们可以直接将选择变成[l1,r2]+一个最优, 因为加入[r1+1,r2]必然不会更劣,不然选择就是[l1,r1],[l2,r1],然后发现包含,于是没有必要.

Lemma 2 Quite Easily Done.

Lemma 1 Quite Easily Done.

(其实感觉不是很严谨啊..谁来提供一个更严谨的证明或找一下证明的bug..)

Theorem CF720F

可以在\(O(n\log^2{n})\)复杂度内完成.

那么我们就先计算前min(n-k,0)个最优, 用二分+扫描线, 然后对于剩下的n个选择我们一次次加入最优区间看现在的答案, 此时我们维护剩下的未选择区间, 先贪心一个n时最优解, 每次被选择就删去两端扩展与它的贡献.

建议对着我的题解看官方题解找感觉.

http://codeforces.com/blog/entry/47183

转载于:https://www.cnblogs.com/tmzbot/p/5995120.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值