先计算每个点的子树有多少节点,然后判断每个子树是不是对称的,更新答案。
1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 struct kkk{ 7 int l,r,v,len; 8 kkk() {l = -1;r = -1;} 9 }e[1000001]; 10 int n,ans; 11 12 bool solve(int ls,int rs) { 13 bool p = 1; 14 if(e[ls].v != e[rs].v) return false; 15 if((e[ls].l != -1 && e[rs].r == -1) || (e[ls].l == -1 && e[rs].r != -1) || (e[ls].r == -1 && e[rs].l != -1) || (e[ls].r != -1 && e[rs].l == -1)) return false; 16 if(e[ls].l != -1 && e[rs].r != -1) 17 p = p & solve(e[ls].l,e[rs].r); 18 if(e[ls].r != -1 && e[rs].l != -1) 19 p = p & solve(e[ls].r,e[rs].l); 20 return p; 21 } 22 23 int dfs(int k) { 24 e[k].len = 1; 25 if(e[k].l != -1) 26 e[k].len += dfs(e[k].l); 27 if(e[k].r != -1) 28 e[k].len += dfs(e[k].r); 29 return e[k].len; 30 } 31 32 int main(){ 33 scanf("%d",&n); 34 for(int i = 1;i <= n; i++) 35 scanf("%d",&e[i].v); 36 for(int i = 1;i <= n; i++) 37 scanf("%d%d",&e[i].l,&e[i].r); 38 dfs(1); 39 for(int i = 1;i <= n; i++) 40 if(solve(e[i].l,e[i].r)) 41 ans = max(ans,e[i].len); 42 printf("%d",ans); 43 return 0; 44 }
//NOIP普及2018 T4
原文:https://www.cnblogs.com/lipeiyi520/p/11268729.html