添加链接描述
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+9;
struct node
{
int x,y1,y2;
int cover;
bool operator <(const node &t)const{
return x<t.x;
}
}t[N*2];
struct segment
{
int l,r;
int cnt;
int len;
}tr[N*8];
void build(int u,int l,int r){
if(l==r)tr[u]={l,r};
else {
int mid=l+r>>1;
tr[u]={l,r};
build(u*2,l,mid);
build(u*2+1,mid+1,r);
}
}
void pushup(int u){
if(tr[u].cnt)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*2].len+tr[u*2+1].len;
}
void modify(int u,int l,int r,int k){
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].cnt+=k;
pushup(u);
}
else {
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid){
modify(u*2,l,r,k);
}
if(r>mid)modify(u*2+1,l,r,k);
pushup(u);
}
}
int m;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
t[++m]={x1,y1,y2,1};
t[++m]={x2,y1,y2,-1};
}
sort(t+1,t+1+m);
build(1,0,10000);
int ans=0;
for(int i=1;i<=m;i++){
if(i>1)ans+=tr[1].len*(t[i].x-t[i-1].x);
modify(1,t[i].y1,t[i].y2-1,t[i].cover);
}
cout<<ans<<endl;
return 0;
}
|