• [NOI2016]区间


    Description

    在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。
    对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri−li,即等于它的右端点的值减去左端点的值。
    求所有合法方案中最小的花费。如果不存在合法的方案,输出 −1。

    Input

    第一行包含两个正整数 n,m用空格隔开,意义如上文所述。保证 1≤m≤n
    接下来 n行,每行表示一个区间,包含用空格隔开的两个整数 li 和 ri 为该区间的左右端点。
    N<=500000,M<=200000,0≤li≤ri≤10^9
     

    Solution

    一看就要排序。

    和长度有关,要知道最大最小的。

    那就按照长度从小到大排序。

    枚举最小的x,

    思考暴力怎么写?

    不断加入后面的区间,直到存在一个位置被覆盖了m次。最后加入的这个y必然是当前最大的。

    由于x不一定是最小的。所以不断往后走x,删掉先加入的区间,并且一边取min,直到不存在位置覆盖>=m次。

    这样就求出来了一个合法的解。

    接下来往后枚举y,重复上述过程即可。

    就是尺取法。

    证明:

    对于一个合法的解,选择的编号区间是[x,y]

    1.之后的合法的解的左端点不能比x小。因为已经考虑过。

    2.不能再是x了。因为右端点不可能比y小,右端点比y大又不优。没有必要枚举。

    所以之后的解的左端点必然更大。

    3.左端点更大之后,右端点不可能比y小。因为如果可以是更小的p<y,那么就会是在[x,p]一定找到合法的解。矛盾。

    综上,之后可能更优的合法的解的左右端点都是更大的。

    证毕。

    至于区间覆盖,离散化+线段树

     
  • 相关阅读:
    CSS优先级及继承
    group by 与 order by
    软件开发升级指南(转)
    安装DELL服务器,安装Windows 2003 sp2 问题
    SQL SERVER 2005数据库总结
    C#操作INI文件(调用WindowsAPI函数:WritePrivateProfileString,GetPrivateProfileString)
    对RBS理解与使用
    WSS和MOSS的区别
    关于.net winform ComboBox数据绑定显示问题
    OpenNETCF.Desktop.Communication.DLL程序集的使用
  • 原文地址:https://www.cnblogs.com/Miracevin/p/9879159.html
Copyright © 2020-2023  润新知