#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int n,sum;
int x1[100010],y1[100010],x2[100010],y2[100010];
int num[200010],cur,cur2;
struct line{int x,y1,y2,k;}a[200010];
bool operator<(const line &x,const line &y){
return x.x<y.x;
}
struct segment_tree{int l,r,cnt,len,ans;}b[1600010];
void build(int x,int l,int r)
{
b[x].l=l,b[x].r=r;
if(l==r)
{
b[x].len=num[l+1]-num[l];
return;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
b[x].len=b[x*2].len+b[x*2+1].len;
}
void add(int x,int l,int r,int k)
{
if(l>b[x].r||r<b[x].l)return;
if(l<=b[x].l&&r>=b[x].r)
{
b[x].cnt+=k;
if(!b[x].cnt)b[x].ans=b[x*2].ans+b[x*2+1].ans;
else b[x].ans=b[x].len;
return;
}
add(x*2,l,r,k);
add(x*2+1,l,r,k);
if(!b[x].cnt)b[x].ans=b[x*2].ans+b[x*2+1].ans;
else b[x].ans=b[x].len;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x1[i]>>y1[i]>>x2[i]>>y2[i];
num[++cur]=y1[i],num[++cur]=y2[i];
}
sort(num+1,num+cur+1);
for(int i=1;i<=n;i++)
{
y1[i]=lower_bound(num+1,num+cur+1,y1[i])-num;
y2[i]=lower_bound(num+1,num+cur+1,y2[i])-num;
a[++cur2]={x1[i],y1[i],y2[i],1};
a[++cur2]={x2[i],y1[i],y2[i],-1};
}
build(1,1,cur-1);
sort(a+1,a+cur2+1);
for(int i=1;i<=cur2;i++)
{
if(i>1)sum+=b[1].ans*(a[i].x-a[i-1].x);
add(1,a[i].y1,a[i].y2-1,a[i].k);
}
cout<<sum<<endl;
return 0;
}
如果将 b 数组开到 800010 过不了,是为什么?