Area of Simple Polygons

poj1389:http://poj.org/problem?id=1389

题意:求矩形面积的并
题解:扫描线加线段树 同poj1389

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=2002;
 7 int num;
 8 struct Node{
 9     int  l;
10     int  r;
11     int tp;
12     int  y;
13  bool operator <(Node a) const{
14             return y<a.y;
15       }
16 }line[2*maxn];
17 int  arr[2*maxn];
18 struct Edge{
19     int left;
20     int right;
21     int flag;
22     int  sum;
23 }node1[maxn*4];
24 void build(int l,int r,int idx){
25     node1[idx].left=l;
26     node1[idx].right=r;
27     if(l==r){
28         node1[idx].flag=0;
29         node1[idx].sum=0;
30         return;
31     }
32     int mid=(l+r)/2;
33     build(l,mid,idx<<1);
34     build(mid+1,r,idx<<1|1);
35     node1[idx].sum=node1[idx<<1].sum+node1[idx<<1|1].sum;
36 }
37 void update(int l,int r,int f,int idx){
38     if(node1[idx].left==node1[idx].right){
39           node1[idx].flag+=f;
40         if(node1[idx].flag)node1[idx].sum=arr[node1[idx].right+1]-arr[node1[idx].left];
41         if(!node1[idx].flag)node1[idx].sum=0;
42         return ;
43     }
44     int mid=(node1[idx].left+node1[idx].right)/2;
45     if(mid>=r)update(l,r,f,idx<<1);
46     else if(mid<l)update(l,r,f,idx<<1|1);
47     else{
48         update(l,mid,f,idx<<1);
49         update(mid+1,r,f,idx<<1|1);
50     }
51     node1[idx].sum=node1[idx<<1].sum+node1[idx<<1|1].sum;
52 }
53 int binaryserach(int  x){
54    int l,r,mid;
55       l=0,r=num+1;
56       while (r-l>1){
57             mid=(l+r)>>1;
58             if (arr[mid]<=x) l=mid;
59                else r=mid;
60       }
61       return l;
62 }
63 int main(){
64     int n;int  x1,y1,x2,y2;
65     long long ans;
66   while(~scanf("%d%d%d%d",&x1,&y1,&x2,&y2)){
67       if(x1==-1&&x2==-1&&y1==-1&&y2==-1)break;
68         num=0;int cnt=2;
69         line[1].l=x1;line[1].r=x2;line[1].y=y1;line[1].tp=1;
70           line[2].l=x1;line[2].r=x2;line[2].y=y2;line[2].tp=-1;
71           arr[++num]=x1;arr[++num]=x2;
72       while(~scanf("%d%d%d%d",&x1,&y1,&x2,&y2)){
73           if(x1==-1&&x2==-1&&y1==-1&&y2==-1)break;
74           
75           line[++cnt].l=x1;line[cnt].r=x2;line[cnt].y=y1;line[cnt].tp=1;
76           line[++cnt].l=x1;line[cnt].r=x2;line[cnt].y=y2;line[cnt].tp=-1;
77           arr[++num]=x1;arr[++num]=x2;
78       }
79       
80   
81       sort(arr+1,arr+num+1);
82         ans=0;
83       sort(line+1,line+cnt+1);
84       build(1,cnt,1);
85      for(int i=1;i<=cnt;i++){
86           ans+=node1[1].sum*(line[i].y-line[i-1].y);
87           int l=binaryserach(line[i].l);
88           int r=binaryserach(line[i].r)-1;
89            update(l,r,line[i].tp,1);
90       }
91       
92     printf("%I64d
",ans);  
93   }
94 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3426963.html