一年後回首此題,此乃暴力也。c++
遇到T4想暴力,這個基本的框架應該熟練掌握,這就是一個基本的學習經驗了,要造成這個直覺思惟,這個基本的意識你們再熟悉一下,沒AK NOIP就不該該了,對吧,誒。框架
#include<bits/stdc++.h> using namespace std; int w[1000005]; int a[1000005][2]; int s[1000005]; void dfs(int x)//求出以編號x的節點爲根的樹的節點數量 { s[x]=1;//根 if(a[x][0]!=-1) dfs(a[x][0]),s[x]+=s[a[x][0]];//左子樹 if(a[x][1]!=-1) dfs(a[x][1]),s[x]+=s[a[x][1]];//右子樹 } bool dfs1(int x,int y) { if(x==-1&&y==-1) return 1;//無左右子樹,即葉節點,對稱 if(x!=-1&&y!=-1&&s[x]==s[y]&&w[x]==w[y])//左右相應位置比較 { if(dfs1(a[x][0],a[y][1])&&dfs1(a[x][1],a[y][0])) return 1;//左左-右右,左右-右左 } return 0; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&w[i]);//輸入每一個節點的權值 for(int i=1;i<=n;i++) scanf("%d%d",&a[i][0],&a[i][1]);//輸入左右孩子 dfs(1); int ans=0; for(int i=1;i<=n;i++) { if(dfs1(a[i][0],a[i][1])) ans=max(ans,s[i]);//求出全部對稱二叉樹中節點最多的 } printf("%d",ans); return 0; }
關於NOIP,它壽終正寢了。一帆風順!學習