1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| int n,m; struct nn{ int x,yy1,yy2,f; }Q[20500000]; int st[20500000]; bool cmp1(nn a,nn b){ return a.x<b.x; } struct node{ int l,r; int m,ans; }e[80500000]; void Build(int l,int r,int idd){ e[idd].l=l; e[idd].r=r; if(l==r) return; int m=(l+r)/2; Build(l,m,idd*2); Build(m+1,r,idd*2+1); } void Up(int idd){ if(e[idd].m>0){ e[idd].ans=st[e[idd].r+1]-st[e[idd].l]; } else{ e[idd].ans=e[idd*2].ans+e[idd*2+1].ans; } } void Update(int l,int r,int idd,int f){ if(l<=e[idd].l && e[idd].r<=r){ e[idd].m+=f; Up(idd); return ; } int m=(e[idd].l + e[idd].r)/2; if(l<=m) Update(l,r,idd*2,f); if(r>m) Update(l,r,idd*2+1,f); Up(idd); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); Q[i]={a,b,d,1}; Q[i+n]={c,b,d,-1}; st[i]=b;st[i+n]=d; } sort(st+1,st+1+2*n); int c=2; for(int i=2;i<=2*n;i++){ if(st[i-1]!=st[i]){ st[c]=st[i]; c++; } } for(int i=1;i<=2*n;i++){ Q[i].yy1=lower_bound(st+1,st+c,Q[i].yy1)-st; Q[i].yy2=lower_bound(st+1,st+c,Q[i].yy2)-st; } sort(Q+1,Q+1+2*n,cmp1); Build(1,c-1,1); long long ans=0; for(int i=1;i<2*n;i++){ Update(Q[i].yy1,Q[i].yy2-1,1,Q[i].f); ans+=1LL*(Q[i+1].x-Q[i].x)*e[1].ans; } printf("%lld\n",ans); }
|