ut.cpp 最大线段并减线段交 [线段树]

news/2024/9/18 9:04:49/文章来源:https://www.cnblogs.com/Glowingfire/p/18377253

题意:给定n条线段的左右端点,求两条有公共点的线段的并的长度减去它们的交的长度最大(\(n<=2e5\) \(1<=L,R<=1e9\)


分析:不妨设\(L_i<=L_j<=R_i\),线段异或和为\(ans\),两条线段的右端点有两种情况:
1.\(R_j>=R_i\)

Rj>=Rj

此时 \(ans=R_j-R_i+L_j-L_i=L_j+R_j-(L_i+R_i)\)
2.\(R_j<=R_i\)

Rj<=Ri

此时 $ ans=R_i-L_i-(R_j-L_j) $

按照线段的左端点从小到大排序(所以这是一个二维数点问题),对左端点相同的,按照右端点从大到小排序,对于第i条线段,每次查询\([L_i,R_i]\)\(L+R\)的最小值(case1)和 \([R_i,n]\)\(R-L\)的最大值(case2),更新答案,然后在当前线段的右端点维护\(L+R\)的最小值和\(R-L\)的最大值。这个查询和修改操作可以用线段树来维护。由于端点坐标可能很大,可以预先离散化后再处理。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
int n,cnt;
struct line{int l,r;}d[N],g[N];
struct segtree{int l,r,len,net;}s[N<<3];
bool cmp(line c,line d){if(c.l==d.l)return c.r>d.r;return c.l<d.l;}
int h[N<<1],num;
void build(int i,int l,int r)
{s[i].l=l;s[i].r=r;if(l==r){s[i].len=h[g[l].r]-h[g[l].l]+1;s[i].net=g[l].r;return ;}int mid=(l+r)>>1;build(i<<1,l,mid);build(i<<1|1,mid+1,r);s[i].net=max(s[i<<1].net,s[i<<1|1].net);s[i].len=max(s[i<<1].len,s[i<<1|1].len);
}
void init()
{scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d%d",&d[i].l,&d[i].r);h[i]=d[i].l;h[i+n]=d[i].r;}sort(h+1,h+1+n*2);num=unique(h+1,h+1+n*2)-h-1;for(int i=1;i<=n;++i){d[i].l=lower_bound(h+1,h+1+num,d[i].l)-h;d[i].r=lower_bound(h+1,h+1+num,d[i].r)-h;}sort(d+1,d+1+n,cmp);for(int i=1;i<=n;++i){if(d[i].l!=d[i-1].l){++cnt;g[cnt].l=d[i].l;g[cnt].r=d[i].r;}}build(1,1,num);
}
int quelen(int i,int x,int y)
{if(s[i].l>=x && s[i].r<=y)return s[i].len;int mid=(s[i].l+s[i].r)>>1,sum=0;if(x<=mid)sum=max(sum,quelen(i<<1,x,y));if(y>mid)sum=max(sum,quelen(i<<1|1,x,y));return sum;
}
int quemx(int i,int x,int y)
{if(s[i].l>=x && s[i].r<=y)return s[i].net;int mid=(s[i].l+s[i].r)>>1,sum=0;if(x<=mid)sum=max(sum,quemx(i<<1,x,y));if(y>mid)sum=max(sum,quemx(i<<1|1,x,y));return sum;
}
void work()
{int ans=0;for(int i=1;i<=cnt;++i){if(g[i].r<num)ans=max(ans,h[g[i].r]-h[g[i].l]+1+quelen(1,g[i].r+1,num));ans=h[quemx(1,g[i].l,g[i].r)]-h[g[i].l]+1;}cout<<ans;
}
int main()
{init();work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Datawhale X 李宏毅苹果书 AI夏令营 -《深度学习详解》Task1

深度学习基础 学习目标理解深度学习的常见概念。 掌握优化神经网络的方法。 找到优化神经网络失败的原因。 学习调整学习率(lr)的高级方法。1、局部极小值与鞍点 在局部极小值与鞍点之前,首先了解一个特殊的点-临界点。 1.1 临界点 通常将梯度为零的点统称为“临界点”。什…

第二周作业

登录页面示例body { font-family: Arial, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: rgba(247, 247, 247, 1) } .login-container { background-color: rgba(255, 255, 255, 1); padding: 20px; border-rad…

「代码随想录算法训练营」第四十五天 | 图论 part3

目录101. 孤岛的总面积DFS思路BFS思路102. 沉没孤岛103. 水流问题104. 建造最大岛屿 101. 孤岛的总面积题目链接:https://kamacoder.com/problempage.php?pid=1173 文章讲解:https://programmercarl.com/kamacoder/0101.孤岛的总面积.html 题目状态:看题解DFS思路 思路: 代…

carlife

carlife是真的画中画。亿连客户端不是。没去除小房子效果如下:

【专题】2024数智医疗服务时代营销机遇洞察报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37466 如今,人工智能、大数据、物联网等众多智能技术持续且深入地在医药产业中得到应用。这不仅极大地增强了医药产业的创新能力,显著提高了医疗服务的质量与效率,还有力地促进了从预防、诊断、治疗到康复的全链条数字化转型,使市场效率得…

049、Vue3+TypeScript基础,页面通讯之使用mitt在任意组件中通讯

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.mount(…

lua协程实现异步编程模式

异步编程模式只是一个代码结构,c#中的async/await的写法就是异步编程模式,这边就是通过协程来达到和async/await类似的效果。异步编程模式写法1:资源分帧加载 这边运行环境用的是:Unity+xLualua脚本:Assets/Lua/Test9.lua.txtlocal _Time = CS.UnityEngine.Timelocal func…

Echarts可视化大屏框架

效果图展示: 源码:<template><div><!-- Header 部分 --><div class="heads"><h3>大数据可视化分析</h3><span>2023-12-12 12:20:45</span></div><!-- 中间部分 --><div class="middle"&…

可视化表单设计生成器可以实现流程化办公吗?

通过本文可以一起走进低代码技术平台、可视化表单设计生成器的更多优势特点。实现流程化办公一直都是很多客户朋友追求的目标。那么,如何才能实现这一目标?如何为客户提供更优良的产品助力提质、降本、增效?低代码技术平台拥有可视化操作界面、更灵活、更高效、更可靠,是专…

蓝帽杯2020-Misc-签到

蓝帽杯2020-Misc-签到 一、题目 题目名:观色怎么说呢,曲曲折折发现了坑🕳,所以记录下 二、解题 根据自己总结的七大类图片隐写排🕳 1、打开010文件结构查看,本来看着是个jpg,打开是个ps过的gif,未发现附加字符串,foremost没看到其他文件,宽高不涉及修改,IDTA块正常…

Django:Swagger文档的配置

前言 第三方库drf-yasg(Django Rest Swagger)。它是一个为Django Rest Framework提供Swagger/OpenAPI规范支持的库。按照以下步骤进行操作: 安装pip install drf-yasg -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com配置 1、在项目的setting…

REST framework:过滤

一、数据准备 模型类class UserInfo(models.Model):name = models.CharField(max_length=20, verbose_name=用户名)pwd = models.CharField(max_length=18, verbose_name=密码)email = models.EmailField(max_length=40, verbose_name=邮箱)age = models.IntegerField(verbose_…