hdu 1542 线段树应用 附几组测试数据

这题本来可以不用线段树做的,因为数据比较弱,直接离散化即可。但为了练习线段树,还是用线段树打了,可是却WA了一整天!调了四个小时以后仍没找出错误,让竹子帮我测试,测出了一处错误,又去北大讨论版找了些数据测,终于过了。

我的代码如下,第一次写这类题目,写得比较乱,以后再改进吧。

/*
* hdu1542/linux.cpp
* Created on: 2011-9-1
* Author : ben
*/
#include
<cstdio>
#include
<cstdlib>
#include
<cstring>
#include
<cmath>
#include
<algorithm>
using namespace std;

typedef
struct CNode {
int L, R;
int covers;
double lastx;
CNode
*pLeft, *pRight;
} CNode;

typedef
struct {
double x;
double yi;
double ya;
int cover;
} Line;

const int MAXN = 205;
const int MAX_NODE = 4 * MAXN;

CNode Tree[MAX_NODE];
Line lines[
2 * MAXN];

double ys[2 * MAXN], ans;
int N, N2, nCount;

inline
bool operator<(const Line &a, const Line &b) {
return a.x < b.x;
}

//建立线段树
void BuildTree(CNode *pRoot, int L, int R) {
pRoot
->L = L;
pRoot
->R = R;
pRoot
->covers = 0;
pRoot
->lastx = 0;
if (L == R) {
return;
}
nCount
++;
pRoot
->pLeft = Tree + nCount;
nCount
++;
pRoot
->pRight = Tree + nCount;
int mid = (L + R) / 2;
BuildTree(pRoot
->pLeft, L, mid);
BuildTree(pRoot
->pRight, mid + 1, R);
}

//插入数据
void Update(CNode *pRoot, double i, double v, double x, int cover) {
if (pRoot->L == pRoot->R) {
if (pRoot->covers) {
ans
+= (ys[pRoot->R] - ys[pRoot->L - 1]) * (x - pRoot->lastx);
}
pRoot
->covers += cover;
pRoot
->lastx = x;
return;
}
int mid = (pRoot->L + pRoot->R) / 2;
if (pRoot->covers) {
Update(pRoot
->pLeft, ys[pRoot->L - 1], ys[mid], pRoot->lastx,
pRoot
->covers);
Update(pRoot
->pRight, ys[mid], ys[pRoot->R], pRoot->lastx,
pRoot
->covers);
pRoot
->covers = 0;
}
if (ys[mid] > i && ys[mid] < v) {
Update(pRoot
->pLeft, i, ys[mid], x, cover);
Update(pRoot
->pRight, ys[mid], v, x, cover);
}
else if (ys[mid] >= v) {
Update(pRoot
->pLeft, i, v, x, cover);
}
else {
Update(pRoot
->pRight, i, v, x, cover);
}
}

void work() {
int T = 0;
double xi, yi, xa, ya;
while (scanf("%d", &N) == 1 && N > 0) {
N2
= 0;
for (int i = 0; i < N; i++) {
scanf(
"%lf%lf%lf%lf", &xi, &yi, &xa, &ya);
lines[N2].yi
= yi;
lines[N2].ya
= ya;
lines[N2].cover
= 1;
lines[N2].x
= xi;
ys[N2
++] = yi;
lines[N2].yi
= yi;
lines[N2].ya
= ya;
lines[N2].cover
= -1;
lines[N2].x
= xa;
ys[N2
++] = ya;
}
nCount
= 0;
BuildTree(Tree,
1, N2 - 1);
sort(ys, ys
+ N2);
sort(lines, lines
+ N2);
ans
= 0;
for (int i = 0; i < N2; i++) {
Update(Tree, lines[i].yi, lines[i].ya, lines[i].x, lines[i].cover);
}
printf(
"Test case #%d\nTotal explored area: %.2f\n\n", ++T, ans);
}
}

int main() {
#ifndef ONLINE_JUDGE
freopen(
"data.in", "r", stdin);
#endif
work();
return 0;
}

  

下面是我的测试数据,希望对以后做此题不过者有用。

输入数据:

2
1 2 6 3
3 1 4 5
5
137 10 275 20
296 201 306 275
265 105 497 115
233 74 402 84
296 10 402 147
5
1.37 0.10 2.75 0.20
2.96 2.01 3.06 2.75
2.65 1.05 4.97 1.15
2.33 0.74 4.02 0.84
2.96 0.10 4.02 1.47
3
1 1 6 7
4 2 11 5
2 0 8 3
3
1 1 3 3
2 2 6 6
0 0 4 4
3
3 3 4 4
1 1 5 5
2 2 3 3
3
1 1 4 4
2 2 3 3
10 10 20 20
2
1 1 4 4
2 2 3 3
3
15 15 25 25.5
10 10 20 20
15 15 20 20
2
1 1 2 2
2 2 3 3
1
1 1 2 2
2
10 10 20 20
10 20 20 30
3
10 10 20 20
15 15 25 25.5
30 10 40 20
2
15 15 25 25.5
10 10 20 20
8
9.33 19.52 30.44 24.39
8.06 29.38 9.75 51.77
22.38 15.06 32.35 33.30
30.66 19.20 44.13 19.62
17.93 15.38 39.35 41.58
9.65 6.47 29.80 10.39
26.20 24.61 40.63 35.85
25.25 12.51 29.80 36.17
8
157.98 278.30 246.25 501.22
152.89 15.06 355.43 214.74
61.53 56.12 141.85 96.97
21.43 303.77 250.07 329.65
5.83 115.65 306.10 211.88
275.44 132.52 353.21 276.49
149.71 175.49 271.40 379.94
127.42 32.57 187.05 282.22
0

输出数据如下

Test case #1
Total explored area: 8.00

Test case #2
Total explored area: 18532.00

Test case #3
Total explored area: 1.85

Test case #4
Total explored area: 53.00

Test case #5
Total explored area: 28.00

Test case #6
Total explored area: 16.00

Test case #7
Total explored area: 109.00

Test case #8
Total explored area: 9.00

Test case #9
Total explored area: 180.00

Test case #10
Total explored area: 2.00

Test case #11
Total explored area: 1.00

Test case #12
Total explored area: 200.00

Test case #13
Total explored area: 280.00

Test case #14
Total explored area: 180.00

Test case #15
Total explored area: 751.10

Test case #16
Total explored area: 99910.16
原文地址:https://www.cnblogs.com/moonbay/p/2164378.html