扫描线矩形周长的并 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 }