首页 > 其他分享 >E. Boring Segments (双指针 + 线段树)

E. Boring Segments (双指针 + 线段树)

时间:2023-03-06 21:11:20浏览次数:44  
标签:连通 minn Boring Segments 权值 线段 指针

E. Boring Segments (双指针 + 线段树)

题意:给出n条线段的左右端点和权值$l_i$,$r_i$,$w_i$。要求选择一些线段,使得能够从数轴上的1出发,沿着线段走,能够到达m(连通,不是覆盖)。问选择的线段中最大权值与最小权值的差最小值是多少。$1≤n≤3⋅10^{5}$,$2≤m≤10^{6}$.

 

思路:

  我们最终选择的线段中一定有一个权值最大的线段,相应的也一定有权值最小的线段,这两个极值的差将构成最终的答案,权值位于二者之中的线段对答案没有影响,所以我们可以都选上。有了这个考虑,思路就可以转换成枚举答案中权值最大最小的线段。

  先将线段根据$w_i$从小到大排序,然后从左向右枚举线段R(权值最大的线段),考虑:线段R作为最大权值时,最左侧的L(权值最小的线段)最大能是多少,满足将区间1~m连通。通过分析我们得知,当R不断向右移动时,L要么不变,要么向右走直到找到最大值,总之不会回退,因此这个过程可以用双指针维护。

  至于如何判断线段[L,R]能将区间1~m连通,我们需要用线段树来维护。线段树里需要维护的信息有:该区间被添加了几次的计数变量add,同时还要有判断左右两个区间是否都被连通了的变量minn。在初始化和添加删除边的过程中add和minn维护的值并无差别,只是在回溯的时候minn = min(t[ls].minn, t[rs].minn),如果minn大于1,则说明左右两个子区间都被连通了,否则说明没有连通。所以想要判断1~m有没有连通,只需要看t[1].minn是否大于0即可。

  还有一个细节,因为我们要判断1~m是否连通而不是覆盖,所以我们需要把边转换为点,将点理解成点i延伸向i+1的线段即可,所以m--,每个线段的右端点ri--,就可以判断了。

代码:https://codeforces.com/contest/1555/submission/194738911

标签:连通,minn,Boring,Segments,权值,线段,指针
From: https://www.cnblogs.com/coding-inspirations/p/17185447.html

相关文章

  • 线段树
    使用线段树进行多点更改和多点查询建树#include<iostream>usingnamespacestd;typedeflonglongll;constintN=2e5+10;structsegm{intl,r;llv;......
  • CodeForces 1422F Boring Queries
    洛谷传送门CF传送门套路题。考虑根号分治,\(\le\sqrt{V}=447\)的质因子直接暴力ST表维护。对于\(>\sqrt{V}\)的质因子每个数最多有一个。记\(big_i\)为\(a_......
  • 工业仿真软件:Chai 3D之线段
    推荐:将 ​​NSDT场景编辑器​​ 加入你的3D开发工具链介绍  在几何中,线段是由两个不同端点限定的直线的一部分,包含其端点之间的直线上的每个点。闭合线段包括两个端点。......
  • 线段树维护哈希 | CF213E Two Permutations + CF452F Permutation
    __终于学到了线段树维护xx,嘿嘿,嘿嘿嘿..树树:D做了两题,感觉知识点是维护区间相同不相同可以拿hash做,不连续的区间也可以拿hash维护主要是出得很有想法,太妙了要想得到hh1.......
  • 线段树模板
    structSegmentTree{voidpushUp(intu){maxv[u]=std::max(maxv[u<<1],maxv[u<<1|1]);}voidcoverDown(intu){if(lz1[u]......
  • js高德地图添加点Marker,添加线段Polyline,添加一个区域Polygon(面)
    高德地图JSAPI实例 亲测可用参考网站=>阿里云数据可视化平台(下载json用的):http://datav.aliyun.com/portal/school/atlas/area_selector?spm=a2crr.23498931.0.0.6859......
  • Codeforces 438D The Child and Sequence 势能线段树
    势能线段树|拉线段树题单时发现的这道花神游历各国的骚操作至今让我印象深刻,原来有名字所谓势能,大意就是原本你在高空,操作一点下降一点,势能变少一点..当你落地时,修改......
  • 理解线段树这一篇文章就够啦!
    线段树TODO:补充例题线段树的进阶拓展\(Java\)模板封装类前言本文中,若无特殊说明,数列下标均从\(1\)开始由于本人实力有限,线段树更高级的拓展暂不做考虑引入......
  • Codeforces Round #254 (Div. 1) C - DZY Loves Colors 线段树|lazytag维护区间加
    开一个变量维护同一个区间内颜色是否相同,而且显然要用lazytag了递归到颜色相同的区间时就可以直接打标记然后对于标记,维护的就是常规区间加的部分(最开始没写lazy,wa6,没明......
  • CodeForces-483D Interesting Array 线段树拆位
    让你构造一个数列,满足m种限制条件,每种限制条件是l,r,x,要求构造的序列区间[l,r] 与运算的值结果为x。注意到如果某一位上&运算的结果为1的话,该区间内所有元素都要是1先......