Description
Input
The input file is terminated by a line containing a single 0. Don't process it.
Output
Output a blank line after each test case.
Sample Input
2 10 10 20 20 15 15 25 25.5 0
Sample Output
Test case #1 Total explored area: 180.00
Source
先离散平行y轴的线段,之后排序建立线段树,然后再把平行于x轴的线段离散,之后排序,最后得出面积,离散后都是点;
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
struct ele
{
double x;
double y1;
double y2;
int flag;
}set[500];
double T[500];
struct Ele
{
int left;
int right;
double y1;
double y2;
int flag;
double len;
}p[1500];
bool cmp(ele x,ele y)
{
return x.x-y.x<0.000001;
}
void build(int x,int y,int step)
{
p[step].left=x;
p[step].right=y;
p[step].y1=T[x];
p[step].y2=T[y];
p[step].flag=0;
p[step].len=0;
if(x==y-1)
return;
else
{
int Mid=(x+y)/2;
build(x,Mid,2*step);
build(Mid,y,2*step+1);
}
}
void college(int step)
{
if(p[step].flag>0)
p[step].len=p[step].y2-p[step].y1;
else
if(p[step].right-p[step].left==1)
p[step].len=0;
else
p[step].len=p[step*2].len+p[2*step+1].len;
return;
}
void update(int step,ele s)
{
if(s.y1==p[step].y1&&s.y2==p[step].y2)
{
p[step].flag+=s.flag;
college(step);
return;
}
else
{
if(p[2*step].y2>=s.y2)
update(2*step,s);
else
if(p[2*step+1].y1<=s.y1)
update(2*step+1,s);
else
{
ele temp=s;
temp.y2=p[2*step].y2;
update(2*step,temp);
temp=s;
temp.y1=p[2*step+1].y1;
update(2*step+1,temp);
}
college(step);
return ;
}
}
int main()
{
int ans;
int n;
int i;
int t;
ans=0;
double x1,y1,x2,y2;
while(scanf("%d",&n),n)
{
ans++;
t=1;
for(i=1;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
set[t].x=x1;
set[t].y1=y1;
set[t].y2=y2;
set[t].flag=1;
T[t++]=y1;
set[t].x=x2;
set[t].y1=y1;
set[t].y2=y2;
set[t].flag=-1;
T[t++]=y2;
}
sort(set+1,set+t,cmp);
sort(T+1,T+t);
build(1,t-1,1);
update(1,set[1]);
double sum=0;
for(i=2;i<t;i++)
{
sum+=p[1].len*(set[i].x-set[i-1].x);
update(1,set[i]);
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n",ans,sum);
}
return 0;
}