社区讨论
警示后人
P5018[NOIP 2018 普及组] 对称二叉树参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mkqlpaz1
- 此快照首次捕获于
- 2026/01/23 16:10 4 周前
- 此快照最后确认于
- 2026/01/23 21:44 4 周前
如果你的思路是非常玄学时间复杂度难以证明的思路。
CPP#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
int n, ans;
int l[1000005], r[1000005], a[1000005];
int sz[1000005];
inline void dfs (int x) {
if (l[x] != -1) {
dfs (l[x]);
sz[x] += sz[l[x]];
}
if (r[x] != -1) {
dfs (r[x]);
sz[x] += sz[r[x]];
}
}
inline int check (int x, int y) {
if (x == -1 && y == -1) return 1;
if (x == -1 || y == -1) return 0;
if (a[x] != a[y]) return 0;
return check (l[x], r[y]) && check (r[x], l[y]);
}
int main() {
n = read ();
for (int i = 1; i <= n; i++) a[i] = read ();
for (int i = 1; i <= n; i++) {
sz[i] = 1;
scanf ("%d%d", &l[i], &r[i]);
}
dfs (1);
for (int i = 1; i <= n; i++) {
if (check (l[i], r[i])) ans = max (ans, sz[i]);
}
printf ("%d", ans);
return 0;
}
记得加快读,不然会T飞到80分
回复
共 1 条回复,欢迎继续交流。
正在加载回复...