标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
/* 1.保存矩形的上下边界,并且重要的,记录他们是属于上还是下,然后按高度升序排序 2.保存竖线坐标,并且去重,是为了离散化 3.以保存的上下边界数组去更新 */ #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 110; struct Node { int l,r; double cnt;//该节点的覆盖情况 double len;//该区间被覆盖的总长度 }segTree[2*MAXN*4]; struct Segment { double l,r,h; int f; }ss[MAXN*2]; double pos[MAXN*2]; bool cmp(const Segment& aa,const Segment& bb) { return aa.h<bb.h; } void build(int id,int l,int r) { segTree[id].l=l; segTree[id].r=r; segTree[id].cnt=0; segTree[id].len=0; if(l==r) return; int mid=(l+r)/2; build(id*2,l,mid); build(id*2+1,mid+1,r); } void calen(int id) { if(segTree[id].cnt) segTree[id].len=pos[segTree[id].r+1]-pos[segTree[id].l]; else if(segTree[id].l==segTree[id].r) segTree[id].len=0; else segTree[id].len=segTree[id*2].len+segTree[id*2+1].len; } void update(int id,int l,int r,int val) { if(segTree[id].l==l&&segTree[id].r==r) { segTree[id].cnt+=val; calen(id); return; } int mid=(segTree[id].l+segTree[id].r)/2; if(l>mid) update(id*2+1,l,r,val); else if(r<=mid) update(id*2,l,r,val); else { update(id*2,l,mid,val); update(id*2+1,mid+1,r,val); } calen(id); } int main() { int n; int iCase=0; double x1,y1,x2,y2; while(scanf("%d",&n)==1&&n) { int t=1; iCase++; for(int i=1;i<=n;i++) { scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); ss[t].l=x1,ss[t].r=x2,ss[t].h=y1,ss[t].f=1,pos[t]=x1,t++; ss[t].l=x1,ss[t].r=x2,ss[t].h=y2,ss[t].f=-1,pos[t]=x2,t++; } sort(ss+1,ss+t,cmp); sort(pos+1,pos+t); //for(int i=1; i<t; i++) printf("%.2lf %.2lf %.2lf\n",ss[i].l,ss[i].r,ss[i].h); int m=2; for(int i=2;i<t;i++) if(pos[i]!=pos[i-1]) pos[m++]=pos[i]; build(1,1,m-1); double ans=0; for(int i=1;i<t;i++) { int l=lower_bound(pos+1,pos+m,ss[i].l)-pos; int r=lower_bound(pos+1,pos+m,ss[i].r)-pos-1; //cout<<l<<" "<<r<<endl; update(1,l,r,ss[i].f); ans+=(ss[i+1].h-ss[i].h)*segTree[1].len; } printf("Test case #%d\n",iCase); printf("Total explored area: %.2lf\n\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/wangdongkai/p/5742861.html