考え
その時点の方法は、この質問は、私はこの小さなこんにゃくは、4つのポイント(ダイレクト出力1)、振り返ってみると、その時間があると感じていただった... NOIP2019-pjT4は、これまで最も簡単T4として知られているが、ああ、本当に遅く、最も厄介なこの質問のタイトルを読んで簡単につながる見つけることができる、でもそれがない場合は、直接出力よりも明らかに良い3に直接出力1 3だった - それは結局のところ、ダイレクト出力3ハイスコア--32ポイントひどいです!!!これは32点、ああ、単に白です!!!彼自身、本当に愚かだったが、この質問は本当にあなたがこの質問ACを所有することができ、その後ならば、難しいああではない、と今私はすでに変態の地方の選挙に参加した......不快ああQAQ
しかし、別の観点は、彼が今一度どのように精神遅滞自分自身を感じている、それは、自分の進歩の現れであるようだが、また大きな進歩を遂げ!ある日、私は彼が非常に精神的に無効になっていると感じたときにああ、まあ、私は、私は将来的に進歩し続けることを願っていますが、私は本当に育ちました!
それのアイデアを見て、プルアップしないでください:
私たちは簡単に再帰的な方法を使用して考えることができます:
1.は、ルートノードを列挙し、それはノードが存在し、同じポイントと同等の権利が存在する場合、それは再帰についてされている約2人の子供であるかどうかを判断します。 2つの子供ノードの左と右の子ノードは、上記の決意を繰り返します。
2.対称バイナリツリーを分析、それは2つの対称的なフォークのルートノード、ツリーのノードの数として計算することができ、最適な値をとります。
コード〜
コード
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;
ll n,flag,v[1000000],l[1000000],r[1000000];
void dc(ll x,ll y)
{
if(x==-1&&y==-1)return;
if(x==-1||y==-1||v[x]!=v[y])
{
flag=0;
return;
}
dc(l[x],r[y]);
dc(r[x],l[y]);
return;
}
ll jc(ll x)
{
ll ans=1;
if(l[x]!=-1)ans+=jc(l[x]);
if(r[x]!=-1)ans+=jc(r[x]);
return ans;
}
int main()
{
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>v[i];
}
for(ll i=1;i<=n;i++)
{
cin>>l[i]>>r[i];
}
ll ans=1;
for(ll i=1;i<=n;i++)
{
if(l[i]!=-1&&r[i]!=-1&&v[l[i]]==v[r[i]])
{
flag=1;
dc(l[i],r[i]);
if(flag==1)
{
ans=max(ans,jc(i));
}
}
}
cout<<ans<<endl;
return 0;
}