看了讨论区,一大堆WA20的,我也20了……为什么……
根本找不到BUG啊?
太菜了……
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<algorithm>
#define ll long long
using namespace std;
struct node{
int l,r;
ll h;
int flag;
friend bool operator<(node x,node y){
return x.h<y.h;
}
}edge[200005];
struct segTree{
int l,r;
int vis;
int sum;
int len;
}tree[800005];
int a[200005];
void build(int id,int l,int r){
tree[id].l=l;
tree[id].r=r;
tree[id].len=a[r+1]-a[l];
tree[id].vis=0;
tree[id].sum=0;
if(l==r)
return;
int mid,lc,rc;
mid=(l+r)/2;
lc=2*id,rc=2*id+1;
build(lc,l,mid);
build(rc,mid+1,r);
}
void pushup(int id){
if(tree[id].vis)
tree[id].sum=tree[id].len;
else
tree[id].sum=tree[2*id].sum+tree[2*id+1].sum;
}
void update(int id,int l,int r,int val){
if(l<=tree[id].l&&r>=tree[id].r){
tree[id].vis+=val;
pushup(id);
return;
}
int mid,lc,rc;
mid=(tree[id].l+tree[id].r)/2;
lc=2*id,rc=2*id+1;
if(l<=mid)
update(lc,l,r,val);
if(r>mid)
update(rc,l,r,val);
pushup(id);
}
map<int,int>mp;
int main(){
int n;
scanf("%d",&n);
int p=0,q=0;
for(int i=1;i<=n;i++){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
a[++p]=x1,a[++p]=x2;
edge[++q]={x1,x2,y1,1},edge[++q]={x1,x2,y2,-1};
}
sort(a+1,a+p+1);
sort(edge+1,edge+q+1);
p=unique(a+1,a+p+1)-a;
build(1,1,p-1);
for(int i=1;i<=p;i++)
mp[a[i]]=i;
ll ans=0;
for(int i=1;i<=q;i++){
update(1,mp[edge[i].l],mp[edge[i].r]-1,edge[i].flag);
if(edge[i+1].h!=edge[i].h)
ans+=(ll)(tree[1].sum)*(ll)(edge[i+1].h-edge[i].h);
}
printf("%lld\n",ans);
return 0;
}