标签:
| 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