原題傳送門ios
說點題外話,這道題是NOIP2019-pjT4,被稱做有史以來最簡單的T4,然而...我這個小蒟蒻當時只得了4分(直接輸出1),如今回想起來,以爲本身那時是真的智障啊,最可氣的是,這道題一讀題就能夠發現結果很容易爲3,哪怕徹底不會,直接輸出3也明顯比直接輸出1要好啊——事實證實,直接輸出3的得分高的可怕——32分!!!這簡直是白給的32分啊!!!本身當時是真的傻,並且這道題真心不難啊,當時本身要是能AC了這道題,如今我就已是一個參加過省選的淫了......難受啊QAQspa
不過,換一個角度看,本身如今感慨曾經的本身多麼智障,彷佛正是本身進步的體現,並且進步很大!嗯,好吧,我但願我之後也會不斷進步,當有一天,我以爲如今的本身也很智障的時候,我就是真正成長起來了!code
不扯了,看思路吧:
咱們很容易就能想到用遞歸的方法:
1.枚舉根節點,判斷其左右兩個孩子節點 是否存在 以及 是否相等. 若存在而且點權相等,則一直遞歸左右兩個孩子節點的左右兩個孩子節點,重複上述判斷。
2.判斷好對稱二叉樹後,就能夠計算以該節點爲根節點的對稱二叉子樹的節點數量並取最優值了。遞歸
上代碼~ci
#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; }