zoukankan      html  css  js  c++  java
  • CF720F

    题目描述

    给定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<x

    那么对于并非最优的k-p>n个子段, 一定有两个子段重叠在前p大子段没有到达的地方(鸽笼).

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

    即部分选择[l1,r1]l2,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(nlog^2{n}))复杂度内完成.

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

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

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

  • 相关阅读:
    Jessica's Reading Problem POJ
    FatMouse and Cheese HDU
    How many ways HDU
    Humble Numbers HDU
    Doing Homework again
    Stacks of Flapjacks UVA
    Party Games UVA
    24. 两两交换链表中的节点
    面试题 03.04. 化栈为队
    999. 可以被一步捕获的棋子数
  • 原文地址:https://www.cnblogs.com/tmzbot/p/5995120.html
Copyright © 2011-2022 走看看