[NOI]2016 区间(线段树)

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

Output

只有一行,包含一个正整数,即最小花费。

Sample Input
6 3
3 5
1 2
3 4
2 2
1 5
1 4
Sample Output
2


l,r的范围给的很大,那么一定要离散化。由于题目中选取方案花费的特点,可以将原区间按长度由小到大排列,枚举左右端点区间暴力。

如何优化?可以发现每个l对应的最小满足条件的r是单调递增的,那么就可以使用类似滑动窗口的方法。不去考虑具体情况,每次加入一个新区间,就给这个区间全部加上1,删去一个区间则加上-1,用线段树来实现,线段树上的值表示区间被覆盖多少次。在线段树上维护区间最大值,每次最大值小于m则新加入区间,每次最大值大于等于m则更新答案并将左指针向后挪一位,扫完即可。

posted @ 2019-08-24 17:11  Setaria_Italica  阅读(79)  评论(0)    收藏  举报