扫描线矩形周长的并 POJ1177

Posted blues

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扫描线矩形周长的并 POJ1177相关的知识,希望对你有一定的参考价值。

 1 //扫描线矩形周长的并 POJ1177
 2 // 我是按x轴
 3 
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cstdlib>
 7 #include <algorithm>
 8 #include <vector>
 9 #include <cmath>
10 #include <cstring>
11 // #include <memory.h>
12 // #include <bits/stdc++.h>
13 using namespace std;
14 #define LL long long
15 typedef pair<int,int> pii;
16 const LL inf = 0x3f3f3f3f;
17 const LL MOD =100000000LL;
18 const int N = 5010;
19 const double eps = 1e-5;
20 void fre() {freopen("in.txt","r",stdin);}
21 void freout() {freopen("out.txt","w",stdout);}
22 inline int read() {int x=0,f=1;char ch=getchar();while(ch>9||ch<0) {if(ch==-) f=-1; ch=getchar();}while(ch>=0&&ch<=9) {x=x*10+ch-0;ch=getchar();}return x*f;}
23 
24 struct node{
25     int x1,x2,y;
26     int flag;
27     bool operator < (const node &a) const{
28         return y<a.y||(y==a.y&&flag>a.flag);
29     }
30 }e[N<<2];
31 
32 int color[N<<3];
33 int sum[N<<3],hashh[N<<1];
34 int cnt[N<<3],pl[N<<3],pr[N<<3];
35 void pushup(int rt,int l,int r){
36     if(color[rt]) {
37         sum[rt]=hashh[r+1]-hashh[l];
38         cnt[rt]=1;
39         pl[rt]=pr[rt]=1;
40     }
41     else if(l!=r) {
42         sum[rt]=sum[rt<<1]+sum[rt<<1|1];
43         cnt[rt]=cnt[rt<<1]+cnt[rt<<1|1]-(pr[rt<<1]&&pl[rt<<1|1]);
44         pr[rt]=pr[rt<<1|1];
45         pl[rt]=pl[rt<<1];
46     }
47     else sum[rt]=cnt[rt]=pl[rt]=pr[rt]=0;
48 }
49 void update(int l,int r,int L,int R,int rt,int f){
50     if(l<=L&&R<=r){
51         color[rt]+=f;
52         pushup(rt,L,R);
53         return;
54     }
55     int mid=(L+R)>>1;
56     if(l<=mid) update(l,r,L,mid,rt<<1,f);
57     if(r>mid) update(l,r,mid+1,R,rt<<1|1,f);
58     pushup(rt,L,R);
59 }
60 
61 int main(){
62     // fre();
63     int n;
64     scanf("%d",&n);
65         memset(color,0,sizeof(color));
66         memset(sum,0,sizeof(sum));
67         memset(cnt,0,sizeof(cnt));
68         memset(pr,0,sizeof(pr));
69         memset(pl,0,sizeof(pl));
70         int x1,x2,y1,y2;
71         for(int i=1;i<=n;i++){
72            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
73            e[i*2-1].x1=e[i*2].x1=x1;
74            e[i*2-1].x2=e[i*2].x2=x2;
75            e[i*2-1].y=y1,e[i*2].y=y2;
76            e[i*2-1].flag=1,e[i*2].flag=-1;
77            hashh[i*2-1]=x1,hashh[i*2]=x2;
78         }
79         sort(e+1,e+1+2*n);
80         sort(hashh+1,hashh+1+2*n);
81         int ans=0;
82         int lastsum=0;
83         e[0].y=e[1].y;
84         for(int i=1;i<=2*n;i++){
85             ans+=(e[i].y-e[i-1].y)*2*cnt[1];
86             int l=lower_bound(hashh+1,hashh+1+2*n,e[i].x1)-hashh;
87             int r=lower_bound(hashh+1,hashh+1+2*n,e[i].x2)-hashh-1;
88             if(l<=r) update(l,r,1,2*n,1,e[i].flag);
89             ans+=abs(sum[1]-lastsum);
90             lastsum=sum[1];   
91         }
92         printf("%d\n",ans);
93     return 0;
94 }

 

以上是关于扫描线矩形周长的并 POJ1177的主要内容,如果未能解决你的问题,请参考以下文章

POJ1177 Picture —— 求矩形并的周长 线段树 + 扫描线 + 离散化

POJ 1177 Picture(线段树:扫描线求轮廓周长)

Picture POJ - 1177(矩形周长并))

HDOJ1828&&POJ1177Picture(线段树,扫描线)

POJ 1177 Picture

poj1177 Picture