HDU1542 Atlantis(求矩形面积并)
原题链接
模板题:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,cnt[4*100000];
struct smx
{
double x1,x2,y;
int value;
}
p[200005];
int cmp(smx a,smx b)
{
return a.y<b.y;
}
double LX[200005],sum[4*100000];
struct sz
{
int l,r;
} sz[4*100005];
void pushup(int root)
{
if(cnt[root]>0)sum[root]=LX[sz[root].r+1]-LX[sz[root].l];
else if(sz[root].l==sz[root].r)
sum[root]=0;
else sum[root]=sum[root<<1]+sum[root<<1|1];
}
void update(int l,int r,int root,int value)
{
if(sz[root].l>=l&&sz[root].r<=r)
{
cnt[root]+=value;//cnt[root]>0表示root表示的区间全部被覆盖.
pushup(root);
return ;
}
if(sz[root].l==sz[root].r)
return ;
int mid=(sz[root].l+sz[root].r)>>1;
if(l<=mid)update(l,r,root<<1,value);
if(r>=mid+1)update(l,r,root<<1|1,value);
pushup(root);
}
void builttree(int l,int r,int root)
{
sz[root].l=l;
sz[root].r=r;
if(l==r)return ;
int mid=(l+r)>>1;
builttree(l,mid,root<<1);
builttree(mid+1,r,root<<1|1);
}
int main()
{
int k=1;
while(scanf("%d",&n)==1&&n)
{
double ans=0,a,b,c,d;
int cnt1=0,tot=0,i;
for(i=1; i<=n; i++)
{
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
LX[cnt1++]=a;//离散化.
LX[cnt1++]=c;
p[tot++]= {a,c,b,1};
p[tot++]= {a,c,d,-1};
}
sort(LX,LX+cnt1);
sort(p,p+tot,cmp);
cnt1 = unique(LX, LX+cnt1) - LX;//去重.
builttree(0,cnt1-2,1);
memset(sum,0,sizeof(sum));
memset(cnt,0,sizeof(cnt));
for(i=0; i<tot; i++)
{
if(i!=0)
ans+=(p[i].y-p[i-1].y)*sum[1];
int l,r;
l=lower_bound(LX,LX+cnt1,p[i].x1)-LX;
r=lower_bound(LX,LX+cnt1,p[i].x2)-LX-1;//点代表区间的方式解决mid~mid+1被少计算的问题.
update(l,r,1,p[i].value);
}
printf("Test case #%d\nTotal explored area: %.2f\n\n",k++,ans);
}
return 0;
}
有关于更多二维数轴矩形面积与周长问题
不用看,反正我也学不会唉
Bye!