社区讨论

警示后人

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 条回复,欢迎继续交流。

正在加载回复...