您当前的位置: 首页 > 

对方正在debug

暂无认证

  • 4浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Boring Segments(线段树/双指针/sort)

对方正在debug 发布时间:2021-08-05 00:08:29 ,浏览量:4

题目 题意:给定n个线段,长度m,每个线段有有左右端点 l i , r i l_i,r_i li​,ri​和权重 w i w_i wi​,现要从这n个线段选出若干个出来,使得选出的选段能衔接在一起,连通1到m。两个线段可以衔接,当且仅当它们有公共相交区域。对于每个能连通1到m的线段组合,取权值的最大值和最小值,现要求找出一组线段,使得能连通1到m,且最大值和最小值的差值最小化。 参考 题解: 看了题解才悟了按权值排序的重要性。一开始思考往线段的左右端点排序去了。 我们将线段按权值从小到大排序,接着利用双指针的思想,固定l,求能连通1到m的最小的r。我们可以往线段数里边添加边,维护最小值,当线段树的根节点的最小值大于0,则说明已完全覆盖了。

注意一个点,[1,2]和[3,5]这两个线段是不能衔接的,因为它们没有公共交点。即,我们不能当前把这个题目当成区间覆盖问题。解决方式是把每个线段的右节点都减一即可,这样区间[1,2]和[3,5](实际为[1,3],[3,6])就实际是有衔接的了,注意也要把m减一。

线段树太久没写,懒惰标记都忘记加了_(:з」∠)_

#include 
using namespace std;
const int maxn = 300010;
const int maxm = 1000010;
#define lson (rt             
关注
打赏
1664895754
查看更多评论
0.0369s