题意:给你n个矩形,算他们叠在一起覆盖的面积和。
分析:由于矩形的坐标是浮点类型,为处理要先离散化成整数而后进行线段树的更新。
计算矩形面积的过程,最好自己在纸上多画一画就清楚了。
ps:按照不同颜色一个个将面积加起来就得到了最后的答案。
#include
#include
#include
#include
#include
#include
#define lson L, mid, (rt<<1)
#define rson mid+1, R, (rt<<1|1)
using namespace std;
const int N = 1e5+10;
struct node
{
double l,r,h;
int temp;
node(){}
node(double x1,double x2,double y,int t):l(x1),r(x2),h(y),temp(t){}
bool operator < (const node&nod)const{
return h < nod.h;
}
};
double sum[N<<2];
int cnt[N<<2];
vector q;
vectorp;
int getid(double x)
{
return lower_bound(p.begin(),p.end(),x) - p.begin();
}
void pushup(int l,int r,int rt)
{
if(cnt[rt]) sum[rt] = p[r+1]-p[l];
else if(l == r) sum[rt] = 0;
else sum[rt] = sum[(rt<<1)]+sum[(rt<<1|1)];
}
void update(int L,int R,int rt,int l,int r,int temp)///l,r为查询区间
{
if(l <= L&&R <= r)
{
cnt[rt] += temp;
pushup(L,R,rt);
return ;
}
int mid = (L+R)>>1;
if(l <= mid) update(lson,l,r,temp);
if(r > mid) update(rson,l,r,temp);
pushup(L, R, rt);
}
int main()
{
int n,cas = 0;
while(scanf("%d",&n)==1&&n)
{
p.clear();
q.clear();
for(int i = 1;i <= n; i++)
{
double x1, y1, x2, y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
q.push_back(node(x1,x2,y1,1));
q.push_back(node(x1,x2,y2,-1));
p.push_back(x1);
p.push_back(x2);
}
sort(q.begin(),q.end());
sort(p.begin(),p.end());
p.erase(unique(p.begin(),p.end()),p.end());
memset(cnt,0,sizeof(cnt));
memset(sum,0,sizeof(sum));
double ans = 0;
int len = q.size();
for(int i = 0;i < len-1; i++)
{
int l = getid(q[i].l);
int r = getid(q[i].r)-1;
if(l <= r) update(0,p.size()-1,1, l, r,q[i].temp);
ans += sum[1]*(q[i+1].h - q[i].h);
}
printf("Test case #%d\n",++cas);
printf("Total explored area: %.2f\n\n",ans);
}
return 0;
}