题目描述
给定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大子段被选择 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时最优解, 每次被选择就删去两端扩展与它的贡献.
建议对着我的题解看官方题解找感觉.