题目传送门
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
int child[1000010][2];
int v[1000010];
int sum[1000010];
bool vis[1000010];
LL ans = 1;
void init_sum(int x)
{
sum[x] += 1;
if(child[x][0] > 0)
{
init_sum(child[x][0]);
sum[x] += sum[child[x][0]];
}
if(child[x][1] > 0)
{
init_sum(child[x][1]);
sum[x] += sum[child[x][1]];
}
return;
}
bool dfs(int u,int w)
{
if(!u && !w) return true;
if(sum[u] != sum[w])
{
return false;
}
if(v[u] != v[w])
{
return false;
}
if(!(child[u][1] ^ child[w][0]) || !(child[u][0] ^ child[w][1]))
{
return (dfs(child[u][0],child[w][1]) & dfs(child[u][1],child[w][0]));
}
return false;
}
int main() {
ios::sync_with_stdio(0);
cin >> n;
for(int i = 1;i <= n;i ++)
{
cin >> v[i];
}
for(int i = 1;i <= n;i ++)
{
cin >> child[i][0] >> child[i][1];
if(child[i][0] == -1) child[i][0] = 0;
if(child[i][1] == -1) child[i][1] = 0;
}
init_sum(1);
for(int i = 1;i <= n;i ++)
{
if(child[i][0] && child[i][1] && sum[child[i][0]] == sum[child[i][1]] && ans < sum[i])
{
if(dfs(child[i][0],child[i][1]))
{
ans = sum[i];
}
}
}
cout << ans;
return 0;
}