用线段树来求矩形面积并
比照着其他人的代码,总算理解了。
先熟悉下,代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 220
struct Node
{
int l,r;
int c;
double len;
}node[2000];
struct Line
{
double x,y1,y2;
int f;
}line[maxn];
bool cmp(Line a,Line b)
{
return a.x<b.x;
}
double y[maxn];
int n,len;
void build(int l,int r,int rt)
{
node[rt].l=l;
node[rt].r=r;
node[rt].len=0;
node[rt].c=0;
if(l+1==r) return;
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m,r,rt<<1|1);
}
void PushUp(int rt)
{
if(node[rt].c>0){
node[rt].len=y[node[rt].r]-y[node[rt].l];
}
else if(node[rt].l+1==node[rt].r)
node[rt].len=0;
else
node[rt].len=node[rt<<1].len+node[rt<<1|1].len;
}
void update(int x,int y,int cov,int rt)
{
int l,r;
l=node[rt].l;
r=node[rt].r;
if(l>y||r<x) return ;
if(l>=x&&r<=y){
node[rt].c+=cov;
PushUp(rt);
return ;
}
update(x,y,cov,rt<<1);
update(x,y,cov,rt<<1|1);
/* int m=(l+r)>>1;
if(y<=m) update(x,y,cov,rt<<1);
else if(x>=m) update(x,y,cov,rt<<1|1);
else{
update(x,m,cov,rt<<1);
update(m,r,cov,rt<<1|1);
} */
PushUp(rt);
}
int BinarySearch(double val)
{
int l=0,h=len,m;
while(l<=h){
m=(l+h)>>1;
if(y[m]>val) h=m-1;
else if(y[m]<val) l=m+1;
else return m;
}
return l;
}
int main()
{
int a,b,i,t,ncase=1;
double ans,x1,x2,y1,y2;
while(scanf("%d",&n),n){
t=0;ans=0;
for(i=0;i<n;i++){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
line[t].x=x1;
line[t].y1=y1;
line[t].y2=y2;
line[t].f=1;
y[t++]=y1;
line[t].x=x2;
line[t].y1=y1;
line[t].y2=y2;
line[t].f=-1;
y[t++]=y2;
}
sort(y,y+t);
len=unique(y,y+t)-y;
len--;
build(0,len,1);
sort(line,line+t,cmp);
printf("Test case #%d\n",ncase++);
for(i=0;i<t-1;i++){
a=BinarySearch(line[i].y1);
b=BinarySearch(line[i].y2);
update(a,b,line[i].f,1);
ans+=node[1].len*(line[i+1].x-line[i].x);
}
printf("Total explored area: %0.2lf\n\n",ans);
}
return 0;
}