poj 1177
线段树,详见陈宏的论文。简单讲就是每两次覆盖之间的差值的总和。
代码:
#include<iostream> #include<fstream> #include<cmath> using namespace std; struct e{ int l,r,conut,size; }tree[5000*8]; int a[20001]; int b[20001]; int a1[10001]; int b1[10001]; int n; struct xxx{ int s,t,f,x; }xx[10001]; struct yyy{ int s,t,f,y; }yy[10001]; void build(int l,int r,int p){ tree[p].l=l; tree[p].r=r; tree[p].size=0; tree[p].conut=0; if(l<r-1) { int mid=(l+r)>>1; build(l,mid,2*p); build(mid,r,2*p+1); } } int cmp(const void *a,const void *b){ return ((xxx *)a)->x-((xxx *)b)->x; } int cmp1(const void *a,const void *b){ return ((yyy *)a)->y-((yyy *)b)->y; } void insert(int l,int r,int p,int f){ if(tree[p].l==l&&tree[p].r==r) { tree[p].conut++; if(tree[p].conut==1) { if(f==0) tree[p].size=a1[r]-a1[l]; else tree[p].size=b1[r]-b1[l]; } } else { int mid=(tree[p].l+tree[p].r)>>1; if(r<=mid) insert(l,r,2*p,f); else if(l>=mid) insert(l,r,2*p+1,f); else { insert(l,mid,2*p,f); insert(mid,r,2*p+1,f); } if(tree[p].conut==0) { tree[p].size=tree[2*p].size+tree[2*p+1].size; } } } void delet(int l,int r,int p){ if(tree[p].l==l&&tree[p].r==r) { tree[p].conut--; if(tree[p].conut==0) tree[p].size=tree[2*p].size+tree[2*p+1].size; } else { int mid=(tree[p].l+tree[p].r)>>1; if(r<=mid) delet(l,r,2*p); else if(l>=mid) delet(l,r,2*p+1); else { delet(l,mid,2*p); delet(mid,r,2*p+1); } if(tree[p].conut==0) { tree[p].size=tree[2*p].size+tree[2*p+1].size; } } } int cmp2(const void *a,const void *b){ return *((int *)a)-*((int*)b); } void read(){ // ifstream cin("in.txt"); int i,j,k,k1; int m1,m2,m3,m4; // cin>>n; scanf("%d",&n); k=0;k1=0; for(i=1;i<=n;i++) { // cin>>m1>>m2>>m3>>m4; scanf("%d%d%d%d",&m1,&m2,&m3,&m4); if(!b[m1+10000]) { b[m1+10000]=1; b1[++k1]=m1; } if(!a[m2+10000]) { a[m2+10000]=1; a1[++k]=m2; } if(!b[m3+10000]) { b[m3+10000]=1; b1[++k1]=m3; } if(!a[m4+10000]) { a[m4+10000]=1; a1[++k]=m4; } xx[2*i-1].s=m2; xx[2*i-1].t=m4; xx[2*i-1].f=0; xx[2*i-1].x=m1; xx[2*i].s=m2; xx[2*i].t=m4; xx[2*i].f=1; xx[2*i].x=m3; yy[2*i-1].s=m1; yy[2*i-1].t=m3; yy[2*i-1].f=0; yy[2*i-1].y=m2; yy[2*i].s=m1; yy[2*i].t=m3; yy[2*i].f=1; yy[2*i].y=m4; } qsort(a1+1,k,sizeof(int),cmp2); qsort(b1+1,k1,sizeof(int),cmp2); for(i=1;i<=k;i++) a[a1[i]+10000]=i; for(i=1;i<=k1;i++) b[b1[i]+10000]=i; build(1,k,1); qsort(xx+1,2*n,sizeof(xxx),cmp); qsort(yy+1,2*n,sizeof(yyy),cmp1); j=0; int ans=0; for(i=1;i<=2*n;i++) { if(xx[i].f==0) insert(a[xx[i].s+10000],a[xx[i].t+10000],1,0); else delet(a[xx[i].s+10000],a[xx[i].t+10000],1); ans+=abs(tree[1].size-j); j=tree[1].size; } build(1,k1,1); j=0; for(i=1;i<=2*n;i++) { if(yy[i].f==0) insert(b[yy[i].s+10000],b[yy[i].t+10000],1,1); else delet(b[yy[i].s+10000],b[yy[i].t+10000],1); ans+=abs(tree[1].size-j); j=tree[1].size; } cout<<ans<<endl; } int main(){ read(); return 0; }