rt,一直一车 wa 和 re。
思路是直接将之前的线段分为两类,分开处理
#include<bits/stdc++.h>
using namespace std;
const int MX=1e9;
int n;
int l[200005];
int r[200005];
//left side:v[j] +r[i]-l[i]
//right side:v[j]-r[j] +r[i]
#define mid (l+r>>1)
#define inf 0x3f3f3f3f
struct node{
int ls,rs;
int mx1,mx2;//1:v[i] 2:v[i]-r[i]
}a[2000005];
#define up(x) a[x].mx1=max(a[a[x].ls].mx1,a[a[x].rs].mx1),a[x].mx2=max(a[a[x].ls].mx2,a[a[x].rs].mx2)
int cnt,rt;
void add(int &p,int l,int r,int x,int v1,int v2){
if(!p) p=++cnt,a[p]={0,0,-inf,-inf};
if(l==r){
a[p]={0,0,v1,v2};
return;
}
if(x<=mid) add(a[p].ls,l,mid,x,v1,v2);
else add(a[p].rs,mid+1,r,x,v1,v2);
up(p);
}
int query(int &p,int l,int r,int L,int R,int tp){
if(L>R) return -inf;
if(!p) return -inf;
if(l>=L&&r<=R) return tp==1?a[p].mx1:a[p].mx2;
int mx=-inf;
if(L<=mid) mx=max(mx,query(a[p].ls,l,mid,L,R,tp));
if(R>mid) mx=max(mx,query(a[p].rs,mid+1,r,L,R,tp));
return mx;
}
int main(){
cin>>n;int ans=0;
for(int i=1;i<=n;i++){
cin>>l[i]>>r[i];
int v1=query(rt,1,MX,1,l[i]-1,1),v2=query(rt,1,MX,l[i],r[i]-1,2);
if(v1<=0) v1=0;
v1+=r[i]-l[i]+1;
if(v2==-inf) v2=0;
else v2+=r[i];
int v=max(v1,v2);
//cout<<v<<endl;
//v=max(v,r[i]-l[i]+1);
ans=max(ans,v);
add(rt,1,MX,r[i],v,v-r[i]);
// cout<<i<<":"<<v1<<" "<<v2<<" "<<ans<<endl;
}
cout<<ans<<endl;
return 0;
}