月份的题目,现在又不会写了

暴力枚举每一个点作为堆成二叉树的根节点

这样看上去是的,但是却跑得飞快,跑不满

#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;
}