月份的题目,现在又不会写了
暴力枚举每一个点作为堆成二叉树的根节点
这样看上去是的,但是却跑得飞快,跑不满
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e6+19;
int n,m,l[maxn],r[maxn],val[maxn],root,ans=1,siz[maxn];
bool dfs(int u)
{
siz[u]=1;
if( l[u]!=-1 )
{
dfs( l[u] );
siz[u]+=siz[l[u]];
}
if( r[u]!=-1 )
{
dfs( r[u] );
siz[u]+=siz[r[u]];
}
}
bool isok(int u,int v)
{
if( u==-1 && v== -1 ) return true;
if( u!=-1 && v!=-1 && val[u]==val[v] && isok( l[u],r[v])&&isok(r[u],l[v] ) )
return true;
return false;
}
int main()
{
cin >> n ;
for(int i=1;i<=n;i++) cin >> val[i];
for(int i=1;i<=n;i++)
cin >> l[i] >> r[i];
dfs(1);
for(int i=1;i<=n;i++)
if( isok( l[i],r[i] ) )
ans = max( ans,siz[i] );
cout << ans;
} 
京公网安备 11010502036488号