HDU-1542 Atlantis 求矩形面积并
http://acm.hdu.edu.cn/showproblem.php?pid=1542
该题就是给定N个矩形,求出叠加之后的面积,与求面积交类似,就是覆盖次数没有了要求。
代码如下:
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#define MAXN 205
using namespace std;
struct Node
{
double x, y1, y2;
int lr;
bool operator < (Node t) const
{
return t.x-x>1e-6;
}
}e[MAXN*2];
struct
{
int l, r;
int cover;
}seg[MAXN*3];
double yy[MAXN*2];
void creat(int f, int l, int r)
{
int mid = (l+r)>>1;
seg[f].l = l, seg[f].r = r;
seg[f].cover = 0;
if (r - l > 1)
{
creat(f<<1, l, mid);
creat(f<<1|1, mid, r);
}
}
void modify(int f, int l, int r, int val)
{
int mid = (seg[f].l + seg[f].r) >> 1;
if (seg[f].l == l && seg[f].r == r)
{
seg[f].cover += val;
}
else if (seg[f].r - seg[f].l > 1)
{
if (r <= mid)
modify(f<<1, l, r, val);
else if (l >= mid)
modify(f<<1|1, l, r, val);
else
{
modify(f<<1, l, mid, val);
modify(f<<1|1, mid, r, val);
}
}
}
void query(int f, double &ans)
{
if (seg[f].cover > 0)
{
ans += yy[seg[f].r] - yy[seg[f].l];
}
else if (seg[f].r - seg[f].l > 1)
{
query(f<<1, ans);
query(f<<1|1, ans);
}
}
int main()
{
double x1, y1, x2, y2, ans, res;
int N, ca = 1;;
while (scanf("%d", &N), N)
{
res = 0;
map<double,int>mp;
for (int i = 1, j = 1; i <= N; ++i, j += 2)
{
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
e[j].x = x1, e[j].y1 = y1, e[j].y2 = y2;
e[j].lr = 1;
e[j+1].x = x2, e[j+1].y1 = y1, e[j+1].y2 = y2;
e[j+1].lr = -1;
yy[j] = y1, yy[j+1] = y2;
}
sort(e+1, e+1+2*N);
sort(yy+1, yy+1+2*N);
int cnt = unique(yy+1, yy+1+2*N) - (yy+1);
creat(1, 1, cnt);
for (int i = 1; i <= cnt; ++i)
{
mp[yy[i]] = i;
// printf("yy= %lf\n", yy[i]);
}
for (int i = 1; i < 2*N; ++i)
{
ans = 0;
modify(1, mp[e[i].y1], mp[e[i].y2], e[i].lr);
query(1, ans);
res += ans * (e[i+1].x - e[i].x);
// printf("res = %lf\n", res);
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n", ca++, res);
}
return 0;
}