CF1555E. Boring Segments(2100分、线段树)
https://codeforces.com/contest/1555
题意:
给出\(n\)个区间\([l_i,r_i]\),每个区间有一个权值\(w_i\)。
询问一种选择区间的方案,使得选取区间的最大权值和最小权值的差最小,同时选取的区间覆盖\([1,m]\)的所有点。
题解:
将区间按照权值从小到大排序。
然后对区间序列做一个尺取,因为我们求的是差最小的方案,固定起点的情况下可以确定一个最近的终点作为这个起点的答案,然后把起点往后推一格,新起点的终点只可能在当前终点之后,往后扫到新的满足条件的终点即可。
如何判断当前选取的集合是否可以覆盖所有点:维护一颗线段树,每选择一个序列就在线段树上区间+1,不选择一个序列就在线段树上区间-1。判断的时候查询\([1,m]\)的最小值是否大于0即可。
时间复杂度\(O(nlogn)\)。