救民于水火
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 }}