标签:
2 10 10 20 20 15 15 25 25.5 0
Test case #1 Total explored area: 180.00
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 using namespace std; #define N 605 struct node{ int le,ri,cover; double val; }f[N]; struct stud{ double x1,x2,h; int type; }e[N]; map<double,int>mp; double X[N]; int cmp(stud a,stud b) { return a.h<b.h; } void build(int pos,int le,int ri) { f[pos].le=le; f[pos].ri=ri; f[pos].val=0; f[pos].cover=0; if(le==ri) return ; int mid=MID(le,ri); build(L(pos),le,mid); build(R(pos),mid+1,ri); } void pushup(int pos) { if(f[pos].cover) { f[pos].val=X[f[pos].ri]-X[f[pos].le-1]; return ; } if(f[pos].le==f[pos].ri) f[pos].val=0; else f[pos].val=f[L(pos)].val+f[R(pos)].val; } void update(int pos,int le,int ri,int type) { if(f[pos].le>=le&&f[pos].ri<=ri) { f[pos].cover+=type; pushup(pos); return ; } int mid=MID(f[pos].le,f[pos].ri); // if(le<=mid) // update(L(pos),le,ri,type); // // if(ri>mid) // update(R(pos),le,ri,type); if(mid>=ri) update(L(pos),le,ri,type); else if(mid<le) update(R(pos),le,ri,type); else { update(L(pos),le,mid,type); update(R(pos),mid+1,ri,type); } pushup(pos); } int main() { int i,j; int n,k,ca=0; double x1,x2,y1,y2; while(scanf("%d",&n),n) { k=0; while(n--) { scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); if(x1>x2) swap(x1,x2); if(y1>y2) swap(y1,y2); X[k]=x1; e[k].x1=x1; e[k].x2=x2; e[k].h=y1; e[k++].type=1; X[k]=x2; e[k].x1=x1; e[k].x2=x2; e[k].h=y2; e[k++].type=-1; } sort(X,X+k); sort(e,e+k,cmp); int m=1; for(i=1;i<k;i++) if(X[i]!=X[i-1]) X[m++]=X[i]; for(i=0;i<m;i++) mp[X[i]]=i; m--; build(1,1,m); double ans=0; for(i=0;i<k-1;i++) { int le=mp[e[i].x1]+1; int ri=mp[e[i].x2]; update(1,le,ri,e[i].type); ans+=f[1].val*(e[i+1].h-e[i].h); } printf("Test case #%d\n",++ca); printf("Total explored area: %.2lf\n\n",ans); } return 0; } //另外一种建树方法 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 using namespace std; #define N 605 struct stud{ double x1,x2,h; int type; }e[N]; struct node{ int le,ri,cover; double val; }f[N]; int n; double X[N]; map<double,int>mp; int cmp(stud a,stud b) { return a.h<b.h; } void build(int pos,int le,int ri) { f[pos].le=le; f[pos].ri=ri; f[pos].val=0; f[pos].cover=0; if(le+1==ri) return ; int mid=MID(le,ri); build(L(pos),le,mid); build(R(pos),mid,ri); } void pushup(int pos) { if(f[pos].cover) { f[pos].val=X[f[pos].ri]-X[f[pos].le]; return ; } if(f[pos].le==f[pos].ri||f[pos].le+1==f[pos].ri) f[pos].val=0; else f[pos].val=f[L(pos)].val+f[R(pos)].val; } void update(int pos,int le,int ri,int type) { if(le==ri) return ; if(f[pos].le>=le&&f[pos].ri<=ri) { f[pos].cover+=type; pushup(pos); return ; } int mid=MID(f[pos].le,f[pos].ri); if(mid>=ri) update(L(pos),le,ri,type); else if(mid<le) update(R(pos),le,ri,type); else { if(mid>le) update(L(pos),le,mid,type); if(mid<ri) update(R(pos),mid,ri,type); } pushup(pos); } int main() { int i,j,ca=0; while(scanf("%d",&n),n) { double x1,x2,y1,y2; int k=0; while(n--) { scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); if(x1>x2) swap(x1,x2); X[k]=x1; e[k].x1=x1; e[k].x2=x2; e[k].h=y1; e[k++].type=1; X[k]=x2; e[k].x1=x1; e[k].x2=x2; e[k].h=y2; e[k++].type=-1; } sort(X,X+k); sort(e,e+k,cmp); int m=1; for(i=1;i<k;i++) if(X[i]!=X[i-1]) X[m++]=X[i]; for(i=0;i<m;i++) mp[X[i]]=i; m--; build(1,0,m); double ans=0; for(i=0;i<k-1;i++) { int le=mp[e[i].x1]; int ri=mp[e[i].x2]; update(1,le,ri,e[i].type); ans+=f[1].val*(e[i+1].h-e[i].h); } printf("Test case #%d\n",++ca); printf("Total explored area: %.2lf\n\n",ans); } return 0; }
标签:
原文地址:http://blog.csdn.net/u014737310/article/details/43405953