[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]一定找到合法的解。矛盾。

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

证毕。

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

 
原文地址:https://www.cnblogs.com/Miracevin/p/9879159.html