HDu 1542 Atlantis面積及び線分ツリー走査線
2377 ワード
ここから
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LMT 202
#define left l,m,x<<1
#define right m+1,r,x<<1|1
using namespace std;
//shit double int
struct line
{
double h,l,r;
int d;
line(void){}
line(double y,double x1,double x2,int dd):h(y),l(x1),r(x2),d(dd){}
bool operator<(const line &y)const
{
return h<y.h;
}
}ln[LMT];
double sum[LMT<<2],X[LMT];
int cnt[LMT<<2];
void pushup(int l,int r,int x)// ,
{
if(cnt[x])sum[x]=X[r+1]-X[l];// ,
else if(l==r)sum[x]=0;
else sum[x]=sum[x<<1]+sum[x<<1|1];
/*****
l,r-1 , l,r, ,
l==r , sum[x<<1], ,
, , , ,
*****/
}
void update(int L,int R,int c,int l,int r,int x)
{
if(L<=l&&r<=R)
{
cnt[x]+=c;
pushup(l,r,x);
return;
}
int m=(l+r)>>1;
if(L<=m)update(L,R,c,left);
if(R>m)update(L,R,c,right);
pushup(l,r,x);
}
int equry(double key,int n)//
{
int m,l=0,r=n;
while(l<=r)
{
m=(l+r)>>1;
if(key==X[m])return m;
if(key>X[m])l=m+1;
else r=m-1;
}
return -1;
}
int main(void)
{
int n,k,I=1;
double ans;
while(~scanf("%d",&n)&&n>0)
{
double a,b,c,d;
int num=0;
ans=0;
while(n--)
{
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
ln[num]=line(b,a,c,1);
X[num]=a;
num++;
ln[num]=line(d,a,c,-1);
X[num]=c;
num++;
}
sort(ln,ln+num);
sort(X,X+num);
memset(sum,0,sizeof(sum));
memset(cnt,0,sizeof(cnt));
k=1;
for(int i=1;i<num;i++)
if(X[i]!=X[i-1])X[k++]=X[i];
for(int i=0;i<num-1;i++)
{
int l=equry(ln[i].l,k-1),r=equry(ln[i].r,k-1)-1;
if(l<=r)//
{
update(l,r,ln[i].d,0,k-1,1);//
ans+=sum[1]*(ln[i+1].h-ln[i].h);
}
}
printf("Test case #%d
Total explored area: %.2lf
",I++,ans);
}
return 0;
}