矩形面积并 是一种特殊的成段更新 之所以不需要用到down进行从上往下打破lazy主要是因为
不可能出现一个矩形的长的一段变为0
因为矩形的段长总是成对出现的 这样的话 我们只需要判断这一段有还是没有
#include<stdio.h>
#include<algorithm>
#include<cstdio>
using namespace std;
#define maxn 111111
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((l+r)>>1)
int n,m;
int cnt[maxn<<2];
double sum[maxn<<2];
double X[maxn];
void build(int rt,int l,int r){
sum[rt]=cnt[rt]=0;
if(l==r)return ;
build(ls,l,mid);
build(rs,mid+1,r);
}
void up(int rt,int l,int r){
if(cnt[rt]){
sum[rt]=X[r+1]-X[l];
}else if(l==r)sum[rt]=0;
else sum[rt]=sum[ls]+sum[rs];
}
void ins(int rt,int l,int r,int L,int R,int w){
if(L<=l&&r<=R){
cnt[rt]+=w;
up(rt,l,r);
return;
}
if(L<=mid)ins(ls,l,mid,L,R,w);
if(mid<R)ins(rs,mid+1,r,L,R,w);
up(rt,l,r);
}
struct seg{
int cnt;double l,r,h;
seg(int cnt=0,double l=0,double r=0,double h=0):cnt(cnt),l(l),r(r),h(h){}
bool operator < (const seg &y)const{
return h<y.h;
}
}e[maxn];
int main(){
double a,b,c,d;
int co,cas=1;
while(~scanf("%d",&n),n){
co=0;
for(int i=0;i<n;++i){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
X[co]=a;
e[co++]=seg(1,a,c,b);
X[co]=c;
e[co++]=seg(-1,a,c,d);
}
sort(X,X+co);
sort(e,e+co);
int m=(int)(unique(X,X+co)-X);
build(1,0,m-1);
double ans=0;
for(int i=0;i<co-1;++i){
int l=(int)(lower_bound(X,X+m,e[i].l)-X);
int r=(int)(lower_bound(X,X+m,e[i].r)-X)-1;
// printf("%d %d\n",l,r);
if(l<=r)ins(1,0,m-1,l,r,e[i].cnt);
ans+=sum[1]*(e[i+1].h-e[i].h);
}
printf("Test case #%d\n",cas++);
printf("Total explored area: %.2f\n\n",ans);
}
return 0;
}