原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=3265
一:分析
代码怎么会超时呢,这题和hdu1542差不多,就是要分割矩形而已,提交总是超时,以后再来看吧。下面贴出超时代码。
二:AC代码
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
using namespace std;
#define N 50005*8
struct Line
{
int l, r, h;
int flag;
Line(){}
Line(int _l,int _r,int _h,int _flag):l(_l),r(_r),h(_h),flag(_flag){}
bool operator<(Line & a) const
{
return h < a.h;
}
}line[N];
int n;
int cover[N];
int X[N];
__int64 sum[N];
/* 二分搜索 */
inline int BS(int x)
{
int l = 0;
int r = n;
int mid;
while (1)
{
mid = (l + r) / 2;
if (X[mid] == x)
return mid;
else if (X[mid] < x)
l = mid;
else
r = mid;
if (r - l == 1)
return r;
}
return -1;
}
void update(int pos, int flag, int l, int r, int root)
{
if (l == r)
{
cover[pos] += flag;
if (cover[pos])
sum[root] = X[pos + 1] - X[pos];
if (!cover[pos])
sum[root] = 0;
return;
}
int mid = (l + r) / 2;
if (pos <= mid)
update(pos, flag, l, mid, root * 2);
else
update(pos, flag, mid + 1, r, root * 2 + 1);
sum[root] = sum[root * 2] + sum[root * 2 + 1];
}
int main()
{
int num;
__int64 ans;
int x1, y1, x2, y2, x3, y3, x4, y4;
while (~scanf("%d", &n) && n)
{
num = 1;
int t = 1;
for (int i = 0; i < n; i++)
{
scanf("%d%d%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
line[t++] = Line(x1, x3, y1, 1);
line[t++] = Line(x1, x3, y2, -1);
line[t++] = Line(x4, x2, y1, 1);
line[t++] = Line(x4, x2, y2, -1);
line[t++] = Line(x3, x4, y1, 1);
line[t++] = Line(x3, x4, y3, -1);
line[t++] = Line(x3, x4, y4, 1);
line[t++] = Line(x3, x4, y2, -1);
X[num++] = x1;
X[num++] = x2;
X[num++] = x3;
X[num++] = x4;
}
n = t;
sort(X + 1, X + num);
sort(line + 1, line + n);
memset(sum, 0, sizeof(sum));
memset(cover, 0, sizeof(cover));
ans = 0;
for (int i = 1; i < n; i++)
{
ans += sum[1] * (line[i].h - line[i - 1].h);
int l = BS(line[i].l);
int r = BS(line[i].r) - 1;
for (int j = l; j <= r; j++)
update(j, line[i].flag, 1, n - 1, 1);
}
printf("%I64d\n", ans);
}
return 0;
}