#include <stdio.h>
#include <algorithm>
using namespace std;
double x1,y1,x2,y2,ym[1111];
struct tree
{
double lf,rf,lenth;
int cover;
}s[4444]; //树节点定义
struct node
{
double x,y1,y2;
int flag;
}t[4444]; //存放矩形左,右边的节点
int cmp1(double x,double y)
{
return x < y;
}
int cmp2(node a,node b)
{
return a.x < b.x;
}
void len(int n)
{
if(s[n].cover>0)
s[n].lenth=s[n].rf-s[n].lf;
else
s[n].lenth=s[2*n+1].lenth+s[2*n].lenth;
}
int Build(int x,int y,int num)
{
s[num].lf=ym[x];
s[num].rf=ym[y];
s[num].lenth=s[num].cover=0;
if(x+1==y) return 0;
int mid=(x+y)/2;
Build(x,mid,num+num);
Build(mid,y,num+num+1);
}
int Update(int num,node n)
{
if(s[num].lf==n.y1 && s[num].rf==n.y2)
{
s[num].cover+=n.flag;
len(num);
return 0;
}
if(n.y1>=s[num+num].rf) Update(num+num+1,n);
else if(n.y2<=s[num+num+1].lf) Update(num+num,n);
else
{
node vs=n;
vs.y2=s[num+num].rf;
Update(num+num,vs);
vs=n;
vs.y1=s[num+num+1].lf;
Update(num+num+1,vs);
}
len(num); //往上更新线段被覆盖的实际长度,如果节点的cover>0,
//该区间节点的被覆盖就是区间的整体程度;
//否则,该区间节点的被覆盖等于左右节点被覆盖长度的和
}
int main()
{
int cas,i,j,k=1;
double sum;
while(scanf("%d",&cas) && cas)
{
for(j=i=1;i<=cas;i++,j+=2)
{
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
ym[j]=y1;
t[j].x=x1;
t[j].y1=y1;
t[j].y2=y2;
t[j].flag=1;
ym[j+1]=y2;
t[j+1].x=x2;
t[j+1].y1=y1;
t[j+1].y2=y2;
t[j+1].flag=-1;
}
sort(ym+1,ym+j,cmp1);
sort(t+1,t+j,cmp2);
Build(1,j-1,1);
Update(1,t[1]);
sum=0;
for(i=2;i<j;i++)
{
sum+=(t[i].x-t[i-1].x)*s[1].lenth;//每插入完一个点,就以它后继的点求面积
Update(1,t[i]);
}
printf("Test case #%d\n",k);
printf("Total explored area: %.2lf\n\n",sum);
k++;
}
return 0;
}
—————————————————————————————————
本文原创自Slience的csdn技术博客。
本博客所有原创文章请以链接形式注明出处。
欢迎关注本技术博客,本博客的文章会不定期更新。
大多数人想要改造这个世界,但却罕有人想改造自己。
世上没有绝望的处境,只有对处境绝望的人。
————By slience
—————————————————————————————————