扫描线裸题没什么好说的
注意空间不要开小了!!!
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100100
#define ll long long
using namespace std;
int n,ctx;
int cnt[N<<3];
ll a[N<<1],sum[N<<3];
struct node{
ll l,r;
int la,ra;
}sc[N<<1];
void pushup(int l,int r,int rt)
{
if(cnt[rt]>0) sum[rt]=a[r+1]-a[l];
else if(l==r) sum[rt]=0;
else sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void update(int L,int R,int l,int r,int rt,int w)
{
if(L<=l&&r<=R)
{
cnt[rt]+=w;
pushup(l,r,rt);
return;
}
int mid=(l+r)>>1;
if(L<=mid) update(L,R,l,mid,rt<<1,w);
if(R>mid) update(L,R,mid+1,r,rt<<1|1,w);
pushup(l,r,rt);
}
int main()
{
//freopen("testdata.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&sc[i].l,&sc[i].r);
if(sc[i].l>sc[i].r) swap(sc[i].l,sc[i].r);
a[++ctx]=sc[i].l,a[++ctx]=sc[i].r;
}
sort(a+1,a+ctx+1);
int sz=unique(a+1,a+ctx+1)-(a+1);
for(int i=1;i<=n;i++)
{
sc[i].la=lower_bound(a+1,a+sz+1,sc[i].l)-a;
sc[i].ra=lower_bound(a+1,a+sz+1,sc[i].r)-a;
update(sc[i].la,sc[i].ra-1,1,sz,1,1);
}
ll ret=0;
for(int i=1;i<=n;i++)
{
update(sc[i].la,sc[i].ra-1,1,sz,1,-1);
ret=max(ret,sum[1]);
update(sc[i].la,sc[i].ra-1,1,sz,1,1);
}
printf("%lld\n",ret);
return 0;
}