HDU-1542-Atlantis

来源:互联网 发布:特百惠淘宝旗舰店 编辑:程序博客网 时间:2024/05/11 17:55

HDU-1542-Atlantis

http://acm.hdu.edu.cn/showproblem.php?pid=1542

用线段树求矩形面积的并,模仿别人的代码写的,还要好好研究啊哭

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<algorithm>using namespace std;struct node{int l;int r;int cover;double len;};node tree[2000];struct Line{double down;double up;double x;int cover;};Line line[250];double yy[250];int n,len;int cmp(Line a,Line b){return a.x<b.x;}int find(double x){int low=0,high=len,mid;while(low<=high){mid=(low+high)/2;if(yy[mid]==x)return mid;if(yy[mid]<x)low=mid+1;elsehigh=mid-1;}return low;}void build(int k,int l,int r){tree[k].l=l;tree[k].r=r;tree[k].cover=0;tree[k].len=0;if(l+1==r)return;int mid=(l+r)/2;build(k<<1,l,mid);build(k<<1|1,mid,r);}void fun(int k){if(tree[k].cover)    tree[k].len=yy[tree[k].r]-yy[tree[k].l];else if(tree[k].l+1==tree[k].r)tree[k].len=0;else     tree[k].len=tree[k<<1].len+tree[k<<1|1].len;}void update(int k,int l,int r,int cover){if(tree[k].l>r||tree[k].r<l)return;if(tree[k].l>=l&&tree[k].r<=r){tree[k].cover+=cover;fun(k);return;}update(k<<1,l,r,cover);update(k<<1|1,l,r,cover);fun(k);}int main(){double x1,y1,x2,y2,ans;int i,m,cas=1;int a,b;while(scanf("%d",&n)!=EOF,n){m=0;for(i=0;i<n;i++){scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);yy[m]=y1;line[m].cover=1;line[m].x=x1;line[m].down=y1;line[m].up=y2;m++;yy[m]=y2;line[m].cover=-1;line[m].x=x2;line[m].down=y1;line[m].up=y2;m++;}sort(yy,yy+m);len=unique(yy,yy+m)-yy;len--;build(1,0,len);sort(line,line+m,cmp);ans=0;printf("Test case #%d\n",cas++);for(i=0;i<m-1;i++){a=find(line[i].down);b=find(line[i].up);update(1,a,b,line[i].cover);    ans+=tree[1].len*(line[i+1].x-line[i].x);}printf("Total explored area: %0.2lf\n\n",ans);}return 0;}


原创粉丝点击