【题目】http://acm.hdu.edu.cn/showproblem.php?pid=1542
【大意】
【思路】
【代码】
#include <bits/stdc++.h>
using namespace std;
const int N=505;
int add[N<<2];
double x[N<<2],sum[N<<2];
struct node
{
double l,r,h;
int ss;
node() {}
node(double a,double b,double c,int d):l(a),r(b),h(c),ss(d) {}
} s[N];
bool cmp(node a,node b){return a.h<b.h;}
void update(int L,int R,int c,int l,int r,int rt)
{
int m;
if(L<=l&&r<=R){
add[rt]+=c;
if(add[rt])sum[rt]=x[r+1]-x[l];///
else if(l==r)sum[rt]=0;
else sum[rt]=sum[rt*2]+sum[rt*2+1];
return;
}
m=(l+r)/2;
if(L<=m)update(L,R,c,l,m,rt*2);
if(R>m)update(L,R,c,m+1,r,rt*2+1);
if(add[rt]) sum[rt]=x[r+1]-x[l];///
else if(l==r)sum[rt]=0;
else sum[rt]=sum[rt*2]+sum[rt*2+1];
}
int main()
{
int n,i,k,l,m,r,cas;
double a,b,c,d,ans;
cas=1;
while(scanf("%d",&n)!=EOF&&n){
k=1,ans=m=0;
for(i=0; i<n; i++){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
x[m]=a;
s[m++]=node(a,c,b,1);
x[m]=c;
s[m++]=node(a,c,d,-1);
}
sort(x,x+m);
sort(s,s+m,cmp);
memset(add,0,sizeof(add));
memset(sum,0,sizeof(sum));
for(i=0; i<m-1; i++){
l=lower_bound(x,x+m,s[i].l)-x;///找到s[i].l在x数组里的下标
r=lower_bound(x,x+m,s[i].r)-x-1;
update(l,r,s[i].ss,0,m-1,1);///更新投影
ans+=(sum[1]*(s[i+1].h-s[i].h));
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n",cas++,ans);
}
return 0;
}