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]一定找到合法的解。矛盾。
综上,之后可能更优的合法的解的左右端点都是更大的。
证毕。
至于区间覆盖,离散化+线段树