建议记过程就行了,理解起来太累了
import java.util.*;
public class Main{
static int N=100010,n;
static Seg seg[]=new Seg[N];
static Node tr[]=new Node[N];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
int m=0;
for(int i=0;i<n;i++){
int x1=sc.nextInt();
int y1=sc.nextInt();
int x2=sc.nextInt();
int y2=sc.nextInt();
seg[m++]=new Seg(x1,y1,y2-1,1);
seg[m++]=new Seg(x2,y1,y2-1,-1);
}
Arrays.sort(seg,0,m);
build(1,0,10000);
int res=0;
for(int i=0;i<m;i++){
if(i>0) res+=tr[1].len*(seg[i].x-seg[i-1].x);
modify(1,seg[i].y1,seg[i].y2,seg[i].k);
}
System.out.println(res);
}
static class Seg implements Comparable<Seg>{
int x,y1,y2,k;
Seg(int a,int b,int c,int d){
x=a;y1=b;y2=c;k=d;
}
public int compareTo(Seg o1){
return this.x-o1.x;
}
}
static class Node{
int l,r;
int cnt,len;
Node(int l,int r,int a,int b){
this.l=l;
this.r=r;
cnt=a;len=b;
}
}
static void pushup(int u){
if(tr[u].cnt>0) tr[u].len=tr[u].r-tr[u].l+1;
else if(tr[u].l==tr[u].r) tr[u].len=0;
else tr[u].len=tr[u<<1].len+tr[u*2+1].len;
}
static void build(int u,int l,int r){
tr[u]=new Node(l,r,0,0);
if(tr[u].l==tr[u].r) return ;
else{
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid) build(u<<1,l,mid);
if(r>mid) build(u<<1|1,mid+1,r);
pushup(u);
}
}
static void modify(int u,int l,int r,int v){
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].cnt+=v;
pushup(u);
}else{
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid) modify(u<<1,l,r,v);
if(r>mid) modify(u<<1|1,l,r,v);
pushup(u);
}
}
}