标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3278 | Accepted: 1694 |
Description
Input
Output
Sample Input
0 0 4 4 1 1 5 2 1 1 2 5 -1 -1 -1 -1 0 0 2 2 1 1 3 3 2 2 4 4 -1 -1 -1 -1 -1 -1 -1 -1
Sample Output
18 10
Source
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 5001 using namespace std; struct node { int l,r,ans; int lf,rf,cnt; } q[N<<2]; struct tt { int x,y1,y2; int flag; } p[N<<2]; int pnum[N<<2]; int k; bool cmp(tt a,tt b) { return a.x<b.x; } void build(int l,int r,int rt) { q[rt].l = l; q[rt].r = r; q[rt].ans = 0; q[rt].lf = pnum[l]; q[rt].rf = pnum[r]; q[rt].cnt = 0; if(l+1 == r) { return ; } int mid = (l+r)>>1; build(l,mid,rt<<1); build(mid,r,rt<<1|1); } void updata(int rt) ///确定p[i].x - p[i-1].x区间y的有效区间 { if(q[rt].ans>0) { q[rt].cnt = q[rt].rf - q[rt].lf; return ; } if(q[rt].l + 1 == q[rt].r) { q[rt].cnt = 0; } else { q[rt].cnt = q[rt<<1].cnt + q[rt<<1|1].cnt; } } void insert(int rt,tt dot) /// 线段树进行遍历 { if(q[rt].lf == dot.y1 && q[rt].rf == dot.y2) { q[rt].ans += dot.flag; updata(rt); return ; } if(q[rt<<1].rf >= dot.y2) { insert(rt<<1,dot); } else if(q[rt<<1|1].lf<=dot.y1) { insert(rt<<1|1,dot); } else { tt pt = dot; pt.y1 = q[rt<<1|1].lf; insert(rt<<1|1,pt); pt = dot; pt.y2 = q[rt<<1].rf; insert(rt<<1,pt); } updata(rt); } int main() { int a,b,c,d; while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF) { k = 1; if(a == -1 && b == -1 && c == -1 && d == -1) { break; } p[k].x = a; p[k].y1 = b; p[k].y2 = d; p[k].flag = 1; pnum[k] = b; k++; p[k].x = c; p[k].y1 = b; p[k].y2 = d; p[k].flag = -1; pnum[k] = d; k++; int pf = 1; while(pf) { scanf("%d%d%d%d",&a,&b,&c,&d); if(a == -1 && b == -1 && c == -1 && d == -1) { pf = 0; break; } p[k].x = a; p[k].y1 = b; p[k].y2 = d; p[k].flag = 1; pnum[k] = b; k++; p[k].x = c; p[k].y1 = b; p[k].y2 = d; p[k].flag = -1; pnum[k] = d; k++; } k--; sort(p+1,p+k+1,cmp); sort(pnum+1,pnum+k+1); build(1,k,1); insert(1,p[1]); int sum = 0; for(int i=2;i<=k;i++) { sum += q[1].cnt * (p[i].x - p[i-1].x); /// 矩形的面积 = 长 * 宽 insert(1,p[i]); } printf("%d\n",sum); ///所有分割的小矩形的和 } return 0; }
版权声明:本文为博主原创文章,如有特殊需要请与博主联系 QQ : 793977586。
POJ 1389 Area of Simple Polygons(扫描线)
标签:
原文地址:http://blog.csdn.net/yeguxin/article/details/47297261