【洛谷P5018 对称二叉树】
话说这图也太大了吧
这题十分的简单,我们可以用两个指针指向左右两个对称的东西,然后比较就行了
复杂度O(n*logn)
#include<bits/stdc++.h> using namespace std; inline int read() { int X=0,w=1; char c=getchar(); while(c<'0'||c>'9') { if (c=='-') { w=-1; } c=getchar(); } while(c>='0'&&c<='9') { X=(X<<3)+(X<<1)+c-'0'; c=getchar(); } return X*w; } inline void out(int n) { if(n<0) { putchar('-'); n=-n; } if(n>=10) { out(n/10); } putchar(n%10+'0'); } int n,son[1000050][2],val[1000050],size[1000050]; //son[i][0]为i的左儿子 //son[i][1]为i的右儿子 inline void dfs(int u) { size[u]=1; if(son[u][0]!=- 1) { dfs(son[u][0]); size[u]+=size[son[u][0]]; } if(son[u][1]!=-1) { dfs(son[u][1]); size[u]+=size[son[u][1]]; } } inline bool check(int u,int v) { if(u==-1&&v==-1) { return true; } if(u!=-1&&v!=-1&&val[u]==val[v]&&check(son[u][0],son[v][1])&&check(son[u][1],son[v][0])) { return true; } return false; } int main() { n=read(); for(int i=1;i<=n;i++) { val[i]=read(); } for(int i=1;i<=n;i++) { son[i][0]=read(); son[i][1]=read(); } dfs(1); int ans=0; for(int i=1;i<=n;i++) { if(check(son[i][0],son[i][1])) { ans=max(ans,size[i]); } } out(ans); puts(""); return 0; }