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)\)

posted @ 2021-08-12 13:31  zlc0405  阅读(53)  评论(0编辑  收藏  举报