Topic links: VVQ line segment
Two segments have a common point of two situations:
Intersection: r2 + l2 - (r1 + l1), min intervals to maintain such a case, the corresponding discharge point r (l + r)
comprising: r2-l2 - (r1- l1), this situation is maintained section min , the corresponding discharge point r (rl is an)
What we can do in each case.
AC Code:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=4e5+10;
int n,m,mi[N<<2],res; vector<int> v;
struct node{int l,r;}t[N];
int cmp(node a,node b){return a.r<b.r;}
void build(int p,int l,int r){
if(l==r){mi[p]=1e9; return;}
int mid=l+r>>1;
build(p<<1,l,mid),build(p<<1|1,mid+1,r);
mi[p]=min(mi[p<<1],mi[p<<1|1]);
}
void change(int p,int l,int r,int x,int v){
if(l==r){mi[p]=min(mi[p],v); return;}
int mid=l+r>>1;
if(x<=mid) change(p<<1,l,mid,x,v);
else change(p<<1|1,mid+1,r,x,v);
mi[p]=min(mi[p<<1],mi[p<<1|1]);
}
int ask(int p,int l,int r,int ql,int qr){
if(l==ql&&r==qr) return mi[p];
int mid=l+r>>1;
if(qr<=mid) return ask(p<<1,l,mid,ql,qr);
else if(ql>mid) return ask(p<<1|1,mid+1,r,ql,qr);
else return min(ask(p<<1,l,mid,ql,mid),ask(p<<1|1,mid+1,r,mid+1,qr));
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d %d",&t[i].l,&t[i].r),v.push_back(t[i].l),v.push_back(t[i].r);
sort(v.begin(),v.end()),v.erase(unique(v.begin(),v.end()),v.end()); m=v.size();
sort(t+1,t+1+n,cmp); build(1,1,m);
for(int i=1;i<=n;i++){
t[i].l=lower_bound(v.begin(),v.end(),t[i].l)-v.begin()+1;
t[i].r=lower_bound(v.begin(),v.end(),t[i].r)-v.begin()+1;
res=max(res,v[t[i].l-1]+v[t[i].r-1]-ask(1,1,m,t[i].l,t[i].r));
change(1,1,m,t[i].r,v[t[i].l-1]+v[t[i].r-1]);
}
build(1,1,m);
for(int i=1;i<=n;i++){
res=max(res,v[t[i].r-1]-v[t[i].l-1]-ask(1,1,m,t[i].l,t[i].r));
change(1,1,m,t[i].r,v[t[i].r-1]-v[t[i].l-1]);
}
cout<<res;
return 0;
}