首页 > 代码库 > 扫描线
扫描线
Atlantis http://poj.org/problem?id=1151 http://acm.hdu.edu.cn/showproblem.php?pid=1542
1 #include<cstdio> 2 #include<algorithm> 3 #include<map> 4 #define lrrt int L,int R,int rt 5 #define iall 1,n,1 6 #define imid int mid=(L+R)>>1 7 #define lson L,mid,rt<<1 8 #define rson mid+1,R,rt<<1|1 9 using namespace std;10 const int M=210;11 struct line{12 double left,right,high;13 int flag;14 friend bool operator <(line a,line b){15 return a.high<b.high;16 }17 }l[M];18 double x[M];19 struct T{20 int cover;21 double len;22 }tree[M<<2];23 void build(lrrt){24 tree[rt].cover=0;25 tree[rt].len=0;26 if(L==R) return ;27 imid;28 build(lson);29 build(rson);30 }31 void pushup(lrrt){32 if(tree[rt].cover) tree[rt].len=x[R-1]-x[L-2];33 else if(L==R) tree[rt].len=0;34 else tree[rt].len=tree[rt<<1].len+tree[rt<<1|1].len;35 }36 void update(int x,int y,int val,lrrt){37 if(x<=L&&R<=y){38 tree[rt].cover+=val;39 pushup(L,R,rt);40 return ;41 }42 imid;43 if(mid>=x) update(x,y,val,lson);44 if(mid<y) update(x,y,val,rson);45 pushup(L,R,rt);46 }47 map<double,int> toid;48 int main(){49 int n,cas=1;50 while(~scanf("%d",&n),n){51 int lx=0;52 int len=0;53 while(n--){54 double x1,y1,x2,y2;55 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);56 x[lx++]=x1;57 x[lx++]=x2;58 l[len].left=x1;59 l[len].right=x2;60 l[len].high=y1;61 l[len].flag=-1;62 len++;63 l[len].left=x1;64 l[len].right=x2;65 l[len].high=y2;66 l[len].flag=1;67 len++;68 }69 sort(x,x+lx);70 sort(l,l+len);71 n=unique(x,x+lx)-x;72 build(iall);73 toid.clear();74 for(int i=0;i<n;i++){75 toid[x[i]]=i+1;76 }77 double ans=0;78 for(int i=0;i<len-1;i++){79 int s=toid[l[i].left];80 int e=toid[l[i].right];81 update(s+1,e,l[i].flag,iall);82 ans+=(l[i+1].high-l[i].high)*tree[1].len;83 }84 printf("Test case #%d\nTotal explored area: %.2f\n\n",cas++,ans);85 }86 return 0;87 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。