ut.cpp 最大线段并减线段交 [线段树]
题意:给定n条线段的左右端点,求两条有公共点的线段的并的长度减去它们的交的长度最大(n<=2e5 1<=L,R<=1e9)
分析:不妨设Li<=Lj<=Ri,线段异或和为ans,两条线段的右端点有两种情况:
1.Rj>=Ri
此时 ans=Rj−Ri+Lj−Li=Lj+Rj−(Li+Ri)
2.Rj<=Ri
此时 ans=Ri−Li−(Rj−Lj)
按照线段的左端点从小到大排序(所以这是一个二维数点问题),对左端点相同的,按照右端点从大到小排序,对于第i条线段,每次查询[Li,Ri]内L+R的最小值(case1)和 [Ri,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; }
本文来自博客园,作者:Glowingfire,转载请注明原文链接:https://www.cnblogs.com/Glowingfire/p/18377253
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具