月份的题目,现在又不会写了
暴力枚举每一个点作为堆成二叉树的根节点
这样看上去是的,但是却跑得飞快,跑不满
#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; }