rt,思路和题解不太一样,维护的最小值和最小值对应的长度。
#include<bits/stdc++.h>
#define int long long
#define mid ((l+r)>>1)
#define ls (p<<1)
#define rs (ls|1)
using namespace std;
const int N=1e5+10,M=998244353;
int n,z,ans,b[N<<1],la[N<<3];
struct op{
int y,l,r,k;
bool operator<(const op&a)const{
return y<a.y;
}
}q[N<<1];
struct node{
int s,mn,mns;
}t[N<<3];
void up(int p){
t[p].s=t[ls].s+t[rs].s;
t[p].mn=min(t[ls].mn,t[rs].mn);
t[p].mns=(t[ls].mn==t[p].mn)*t[ls].mns+(t[rs].mn==t[p].mn)*t[rs].mns;
}
void dd(int p,int d){
la[p]+=d;
if(!t[p].mn)
t[p].s+=t[p].mns;
t[p].mn+=d;
if(!t[p].mn)
t[p].s-=t[p].mns;
}
void down(int p){
if(la[p])
dd(ls,la[p]),
dd(rs,la[p]),
la[p]=0;
}
void add(int p,int l,int r,int x,int y,int d){
if(x<=l&&r<=y)
return dd(p,d);
down(p);
if(x<=mid)
add(ls,l,mid,x,y,d);
if(y>mid)
add(rs,mid+1,r,x,y,d);
up(p);
}
void build(int p,int l,int r){
if(l==r){
t[p].mn=0;
t[p].mns=b[l]-b[l-1];
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
up(p);
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
// freopen("P5490_3.in","r",stdin);
cin>>n;
for(int i=1,xl,xr,yl,yr;i<=n;i++)
cin>>xl>>yl>>xr>>yr,
q[++z]={min(yl,yr),min(xl,xr),max(xl,xr),1},
b[z]=min(xl,xr),
q[++z]={max(yl,yr),min(xl,xr),max(xl,xr),-1},
b[z]=max(xr,xl);
n=z;
sort(b+1,b+1+n);
sort(q+1,q+1+n);
z=unique(b+1,b+1+z)-b-1;
build(1,1,n);
q[n+1].y=q[n].y;
for(int i=1;i<=z;i++){
add(1,1,n,upper_bound(b+1,b+1+z,q[i].l)-b,lower_bound(b+1,b+1+z,q[i].r)-b,q[i].k);
if(q[i+1].y!=q[i].y)
ans+=t[1].s*(q[i+1].y-q[i].y);
}
cout<<ans;
return 0;
}