您的位置:首页 > 其它

poj 1151 Atlantis / hdu 1542 线段树扫描线 矩形面积并

2012-08-10 21:26 661 查看
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const double EP=1e-8;
const int maxn=205;
int n, cas=1;
double hash[maxn];
struct nod{
double x;
int c, id;
}a[maxn];

struct node{
int lef, rig, mid, cover;
}seg[4*maxn];

struct line{
int x1, x2, flag;    //flag==1 down
double y;
}l[maxn];

void make_tree(int num, int lef, int rig){
seg[num].lef=lef;
seg[num].rig=rig;
seg[num].mid=(lef+rig)>>1;
seg[num].cover=0;
if(lef+1!=rig){
make_tree(num<<1, lef, seg[num].mid);
make_tree(num*2+1, seg[num].mid, rig);
}
}

void insert(int num, int lef, int rig, int cover){
if(seg[num].cover!=-1&&seg[num].lef==lef&&seg[num].rig==rig){
seg[num].cover+=cover;
return;
}
if(seg[num].cover>0){
insert(num*2, seg[num*2].lef, seg[num*2].rig, seg[num].cover);
insert(num*2+1, seg[num*2+1].lef, seg[num*2+1].rig, seg[num].cover);
seg[num].cover=-1;
}
if(rig<=seg[num].mid)
insert(num*2, lef, rig, cover);
else if(lef>=seg[num].mid)
insert(num*2+1, lef, rig, cover);
else {
insert(num*2, lef, seg[num].mid, cover);
insert(num*2+1, seg[num].mid, rig, cover);
}
}

double cal(int num, int cover){
if(seg[num].cover>=cover)
return hash[seg[num].rig]-hash[seg[num].lef];
if(seg[num].lef+1==seg[num].rig){
return 0;
}
return cal(num*2, cover)+cal(num*2+1, cover);
}

bool cmpx(nod p1, nod p2){
return p1.x<p2.x;
}
bool cmpid(nod p1, nod p2){
return p1.id<p2.id;
}
bool cmpy(line l1, line l2){
return l1.y<l2.y;
}

void myhash(){
int i;
sort(a, a+2*n, cmpx);
hash[0]=a[0].x;
a[0].c=0;
for(i=1; i<2*n; i++){
if(a[i].x-a[i-1].x<EP)
a[i].c=a[i-1].c;
else {
a[i].c=a[i-1].c+1;
hash[a[i].c]=a[i].x;
}
}
sort(a, a+2*n, cmpid);
for(i=0; i<n; i++){
l[i*2].x1=l[i*2+1].x1=a[i*2].c;
l[i*2].x2=l[i*2+1].x2=a[i*2+1].c;
}
}

void init(){
for(int i=0; i<n; i++){
scanf("%lf%lf%lf%lf", &a[i*2].x, &l[i*2].y, &a[i*2+1].x, &l[i*2+1].y);
l[i*2].flag=1;l[i*2+1].flag=-1;
a[i*2].id=i*2;a[i*2+1].id=i*2+1;
}
}

void solve(){
make_tree(1, 0, 2*n);
myhash();
sort(l, l+2*n, cmpy);
double ans=0;
for(int i=0; i<2*n-1; i++){
insert(1, l[i].x1, l[i].x2, l[i].flag);
ans+=cal(1, 1)*(l[i+1].y-l[i].y);
}
printf("Test case #%d\nTotal explored area: %.2f\n\n", cas++, ans);
}

int main(){
//freopen("1.txt", "r", stdin);
while(scanf("%d", &n)&&n){
init();
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: