#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn =5000;
double sum[maxn<<2],key[maxn<<2];
int lazy[maxn<<2];
struct line
{
double l,r,y;
int s;
bool operator <(const line &S)const
{
return y<S.y;
}
} line[maxn<<2];
void pushup(int rt,int l,int r)
{
if(lazy[rt])sum[rt]=key[r]-key[l-1];
else if(l==r)sum[rt]=0;
else sum[rt]=sum[rt<<1|1]+sum[rt<<1];
}
void update(int c,int L,int R,int l,int r,int rt)
{
if(R>=r&&L<=l)
{
lazy[rt]+=c;
pushup(rt,l,r);
return ;
}
int m=(l+r)>>1;
if(L<=m)update(c,L,R,lson);
if(R>m)update(c,L,R,rson);
pushup(rt,l,r);
}
int main()
{
int t,cas=0;
int num=0,tol=0;
while(cin>>t,t)
{
num=0,tol=0;
double x1,x2,y1,y2;
memset(lazy,0,sizeof lazy);
memset(sum,0,sizeof sum);
for(int i=0; i<t; i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
line[num].y=y1;
line[num].l=x1,line[num].r=x2;
line[num].s=1;
num++;
line[num].y=y2;
line[num].l=x1,line[num].r=x2;
line[num].s=-1;
num++;
key[tol++]=x1;
key[tol++]=x2;
}
sort(key,key+tol);
sort(line,line+num);
int k=0;
for(int i=1; i<tol; i++)
{
if(key[i]!=key[i+1])key[++k]=key[i];
}
k++;
double ans=0;
for(int i=0; i<num; i++)
{
int l=upper_bound(key,key+k,line[i].l)-key;
int r=upper_bound(key,key+k,line[i].r)-key-1;
update(line[i].s,l,r,1,k,1);
ans+=sum[1]*(line[i+1].y-line[i].y);
}
printf("Test case #%d\n",++cas);
printf("Total explored area: %.2lf\n\n",ans);
}
}
HDU - 1542 Atlantis(线段树扫描线基础)
最新推荐文章于 2021-07-19 17:11:09 发布