Skip to content

Commit ae3c84a

Browse files
committed
笛卡尔树的构建
1 parent 3389de7 commit ae3c84a

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

Cartesian-Tree.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
#include <algorithm>
4+
5+
#define NIL 0
6+
7+
using namespace std;
8+
9+
struct data
10+
{
11+
char id[100];
12+
int pr;
13+
}d[50010];
14+
15+
int n, lch[50010], rch[50010], S[50010], sp;
16+
17+
inline void parse(char *buf, char *str, int *num)
18+
{
19+
for (int i = 0; ; i++)
20+
{
21+
if (buf[i] == '/')
22+
{
23+
buf[i] = ' ';
24+
break;
25+
}
26+
}
27+
sscanf(buf, "%s %d", str, num);
28+
}
29+
30+
void print_tree(int rt)
31+
{
32+
if (rt != 0)
33+
{
34+
printf("(");
35+
print_tree(lch[rt]);
36+
printf("%s/%d", d[rt].id, d[rt].pr);
37+
print_tree(rch[rt]);
38+
printf(")");
39+
}
40+
}
41+
42+
inline bool _data_cmp_(const data &x, const data &y)
43+
{
44+
return strcmp(x.id, y.id) < 0;
45+
}
46+
47+
int main()
48+
{
49+
char temp[1000];
50+
while (true)
51+
{
52+
scanf("%d", &n);
53+
if (n == 0)
54+
{
55+
break;
56+
}
57+
for (int i = 1; i <= n; i++)
58+
{
59+
scanf("%s", temp);
60+
parse(temp, d[i].id, &d[i].pr);
61+
}
62+
sort(d + 1, d + n + 1, _data_cmp_);
63+
sp = 0;
64+
for (int i = 1; i <= n; i++)
65+
{
66+
lch[i] = rch[i] = NIL;
67+
S[sp] = 0;
68+
while (sp > 0 && d[i].pr > d[S[sp - 1]].pr) sp--;
69+
if (sp > 0)
70+
{
71+
rch[S[sp - 1]] = i;
72+
}
73+
lch[i] = S[sp];
74+
S[sp++] = i;
75+
}
76+
print_tree(S[0]);
77+
printf("\n");
78+
}
79+
return 0;
80+
}

0 commit comments

Comments
 (0)