标签:洛谷 dp2 dp1 int siz long NOIP2018 二叉树 include
传送门
传送门
判断节点u的子树是否是对称二叉树的方法:
判断hash1[l[u]]是否等于hash2[r[u]]。
其中hash1中存的是按照根左右的顺序的哈希值,hash2存的是按照根右左顺序的哈希值。
当两个hash值相等时,即为对称二叉树。
单哈希和双哈希貌似都不太稳定,而用自然溢出即可AC本题。
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;
const int maxn=1e6+5;
const unsigned long long p1=1000000007;
const unsigned long long p2=9999994751;
const unsigned long long p3=5999995827;
const unsigned long long mod=899800117649;
int n,v[maxn],l[maxn],r[maxn],siz[maxn],ans;
unsigned long long dp1[maxn],dp2[maxn];
void dfs(int u){
siz[u]=1;
dp1[u]=dp2[u]=p1*v[u]%mod;
if(~l[u]) dfs(l[u]),siz[u]+=siz[l[u]],dp1[u]=(dp1[u]+p2*dp1[l[u]])%mod,dp2[u]=(dp2[u]+p3*dp2[l[u]])%mod;
if(~r[u]) dfs(r[u]),siz[u]+=siz[r[u]],dp1[u]=(dp1[u]+p3*dp1[r[u]])%mod,dp2[u]=(dp2[u]+p2*dp2[r[u]])%mod;
}
void dfs2(int u){
if(l[u]==-1&&r[u]==-1){
ans=max(ans,1);
return;
}
if(l[u]!=-1&&r[u]!=-1){
if(siz[l[u]]==siz[r[u]]&&dp1[l[u]]==dp2[r[u]]){
ans=max(ans,siz[u]);
return;
}
}
if(~l[u]) dfs2(l[u]);
if(~r[u]) dfs2(r[u]);
}
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>v[i];
for(int i=1;i<=n;i++){
cin>>l[i]>>r[i];
}
dfs(1);
dfs2(1);
cout<<ans<<endl;
return 0;
}
//NOIP2018普及组 t4
标签:洛谷,dp2,dp1,int,siz,long,NOIP2018,二叉树,include 来源: https://www.cnblogs.com/yinyuqin/p/15488687.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。