CF1555 E

E. Boring Segments

题意

有一个大区间 [1,m][1,m],给定 nn 个小区间
每个小区间范围是 [li,ri](1li<rim)[l_i, r_i] (1\leqslant l_i<r_i\leqslant m),每个小区间还有一个权值 wiw_i

定义两个区间中的点可以相互到达,当且仅当,两个区间存在交集,如 [1,3],[3,4][1,3],[3,4] 连通,而 [1,3],[4,5][1,3],[4,5] 不连通

定义一个子集的花费为:该子集中的最大的权值-最小的权值

现在求一个子集使得在区间 [1,m][1,m] 中的任意两个点都可以相互到达,且花费最少

思路

最一开始想了半天二分答案,发现check函数不好写

看了题解后,发现可以直接通过双指针的方法,对区间的权值进行查询

双指针的方法,一般用于求一个连续的区间,并且右端点关于左端点单调递增

这道题如果将区间按权值,从小到大排序,我们发现它其实是满足使用双指针条件的

当左端点是 ll 时,我们令:f(l)f(l) 为最小的满足条件的右端点位置

我们用反证法证明:f(x)f(x) 是单增的,若 x<x+1,f(x)>f(x+1)\exists x < x+1, f(x) > f(x+1)
由于集合区间 [x+1,f(x+1)][x+1,f(x+1)] 是满足题目要求的
那么集合区间 x[x+1,f(x+1)]=[x,f(x+1)]x \cap [x+1, f(x+1)]=[x, f(x+1)] 一定也是满足题目要求的
那么一定有 f(x)f(x+1)f(x) \leqslant f(x+1)f(x)>f(x+1)f(x) > f(x+1) 矛盾,则 f(x)f(x) 一定单增

判断一个区间 [1,m][1,m] 中的任意两点是否能互相到达,我是直接把数域扩大2倍后,用线段树判断是否能完全覆盖 [2,2m][2,2m] 的,不过感觉标程好像更简单

[1,3],[3,4]    [2,6][6,8]={6} yes,[1,2],[3,4]    [2,4][6,8]= no[1,3],[3,4]\iff [2,6]\cap[6,8]=\{6\}\ yes,\quad [1,2],[3,4]\iff [2,4]\cap[6,8]=\varnothing\ no

总复杂度 O(MlogM+NlogM)O(MlogM+NlogM)


CF1555 E
https://wty-yy.github.io/posts/13627/
作者
wty
发布于
2021年8月4日
许可协议