救民于水火

x-hechengye 2022-08-11 16:24:04 11 返回题目

#include <bits/stdc++.h>
using namespace std;
int n, v[1000001];
bool pre[1000001];
struct point {
    int l, r, son;
} p[1000001];
int deep(int x) {
    if (!p[x].son) {
        return 0;
    }
    return p[x].son = p[x].son + deep(p[x].l) + deep(p[x].r);
}
bool dfs(int l, int r) {
    if (!p[l].son || !p[r].son) {
        if (!p[l].son && !p[r].son) {
            return 1;
        }
        return 0;
    }
    if (v[p[l].l] == v[p[r].r] && v[p[l].r] == v[p[r].l]) {
        if (dfs(p[l].l, p[r].r) && dfs(p[l].r, p[r].l)) {
            return 1;
        } else {
            return 0;
        }
    } else {
        return 0;
    }
    return 0;
}
void arrived(int x) {
    pre[x] = 1;
    if (!p[x].son) {
        return;
    }
    arrived(p[x].l), arrived(p[x].r);
}
int main() {
    cin >> n;
    for (register int i = 1; i <= n; i = -~i) {
        cin >> v[i];
    }
    for (register int i = 1; i <= n; i = -~i) {
       cin >> p[i].l >> p[i].r;
        if (p[i].l != -1) {
            p[i].son++;
        }
        if (p[i].r != -1) {
            p[i].son++;
        }
    }
    deep(1);
    int ans = 1;
    for (register int i = 1; i <= n; i = -~i) {
        if ((p[i].son & 1) == 0 && pre[i] == 0 && p[i].son > ans) {
            if (dfs(i, i)) {
                arrived(i), ans = max(ans, p[i].son + 1);
            } else {
                pre[i] = 1;
            }
        }
    }
    cout << ans;
    return 0;
}
{{ vote && vote.total.up }}