标签:
2 10 10 20 20 15 15 25 25.5 0
Test case #1 Total explored area: 180.00
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
using namespace std;
#define N 605
struct node{
int le,ri,cover;
double val;
}f[N];
struct stud{
double x1,x2,h;
int type;
}e[N];
map<double,int>mp;
double X[N];
int cmp(stud a,stud b)
{
return a.h<b.h;
}
void build(int pos,int le,int ri)
{
f[pos].le=le;
f[pos].ri=ri;
f[pos].val=0;
f[pos].cover=0;
if(le==ri) return ;
int mid=MID(le,ri);
build(L(pos),le,mid);
build(R(pos),mid+1,ri);
}
void pushup(int pos)
{
if(f[pos].cover)
{
f[pos].val=X[f[pos].ri]-X[f[pos].le-1];
return ;
}
if(f[pos].le==f[pos].ri)
f[pos].val=0;
else
f[pos].val=f[L(pos)].val+f[R(pos)].val;
}
void update(int pos,int le,int ri,int type)
{
if(f[pos].le>=le&&f[pos].ri<=ri)
{
f[pos].cover+=type;
pushup(pos);
return ;
}
int mid=MID(f[pos].le,f[pos].ri);
// if(le<=mid)
// update(L(pos),le,ri,type);
//
// if(ri>mid)
// update(R(pos),le,ri,type);
if(mid>=ri)
update(L(pos),le,ri,type);
else
if(mid<le)
update(R(pos),le,ri,type);
else
{
update(L(pos),le,mid,type);
update(R(pos),mid+1,ri,type);
}
pushup(pos);
}
int main()
{
int i,j;
int n,k,ca=0;
double x1,x2,y1,y2;
while(scanf("%d",&n),n)
{
k=0;
while(n--)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
if(x1>x2) swap(x1,x2);
if(y1>y2) swap(y1,y2);
X[k]=x1;
e[k].x1=x1;
e[k].x2=x2;
e[k].h=y1;
e[k++].type=1;
X[k]=x2;
e[k].x1=x1;
e[k].x2=x2;
e[k].h=y2;
e[k++].type=-1;
}
sort(X,X+k);
sort(e,e+k,cmp);
int m=1;
for(i=1;i<k;i++)
if(X[i]!=X[i-1])
X[m++]=X[i];
for(i=0;i<m;i++)
mp[X[i]]=i;
m--;
build(1,1,m);
double ans=0;
for(i=0;i<k-1;i++)
{
int le=mp[e[i].x1]+1;
int ri=mp[e[i].x2];
update(1,le,ri,e[i].type);
ans+=f[1].val*(e[i+1].h-e[i].h);
}
printf("Test case #%d\n",++ca);
printf("Total explored area: %.2lf\n\n",ans);
}
return 0;
}
//另外一种建树方法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
using namespace std;
#define N 605
struct stud{
double x1,x2,h;
int type;
}e[N];
struct node{
int le,ri,cover;
double val;
}f[N];
int n;
double X[N];
map<double,int>mp;
int cmp(stud a,stud b)
{
return a.h<b.h;
}
void build(int pos,int le,int ri)
{
f[pos].le=le;
f[pos].ri=ri;
f[pos].val=0;
f[pos].cover=0;
if(le+1==ri) return ;
int mid=MID(le,ri);
build(L(pos),le,mid);
build(R(pos),mid,ri);
}
void pushup(int pos)
{
if(f[pos].cover)
{
f[pos].val=X[f[pos].ri]-X[f[pos].le];
return ;
}
if(f[pos].le==f[pos].ri||f[pos].le+1==f[pos].ri)
f[pos].val=0;
else
f[pos].val=f[L(pos)].val+f[R(pos)].val;
}
void update(int pos,int le,int ri,int type)
{
if(le==ri) return ;
if(f[pos].le>=le&&f[pos].ri<=ri)
{
f[pos].cover+=type;
pushup(pos);
return ;
}
int mid=MID(f[pos].le,f[pos].ri);
if(mid>=ri)
update(L(pos),le,ri,type);
else
if(mid<le)
update(R(pos),le,ri,type);
else
{
if(mid>le)
update(L(pos),le,mid,type);
if(mid<ri)
update(R(pos),mid,ri,type);
}
pushup(pos);
}
int main()
{
int i,j,ca=0;
while(scanf("%d",&n),n)
{
double x1,x2,y1,y2;
int k=0;
while(n--)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
if(x1>x2) swap(x1,x2);
X[k]=x1;
e[k].x1=x1;
e[k].x2=x2;
e[k].h=y1;
e[k++].type=1;
X[k]=x2;
e[k].x1=x1;
e[k].x2=x2;
e[k].h=y2;
e[k++].type=-1;
}
sort(X,X+k);
sort(e,e+k,cmp);
int m=1;
for(i=1;i<k;i++)
if(X[i]!=X[i-1])
X[m++]=X[i];
for(i=0;i<m;i++)
mp[X[i]]=i;
m--;
build(1,0,m);
double ans=0;
for(i=0;i<k-1;i++)
{
int le=mp[e[i].x1];
int ri=mp[e[i].x2];
update(1,le,ri,e[i].type);
ans+=f[1].val*(e[i+1].h-e[i].h);
}
printf("Test case #%d\n",++ca);
printf("Total explored area: %.2lf\n\n",ans);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/u014737310/article/details/43405953