https://www.luogu.com.cn/record/178631783
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
int n,l[N],r[N],qwq[N],siz[N],sum[N],ans=1;
unsigned int val[N],lans[N],rans[N],lsiz[N],rsiz[N];
int read(){
int f=1,k=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
k=k*10+c-'0';
c=getchar();
}
return f*k;
}
void dfs(int x){
siz[x]=1;
lsiz[x]=rsiz[x]=1;
sum[x]=val[x];
lans[x]=rans[x]=val[x];
if(l[x]!=-1){
dfs(l[x]);
sum[x]+=sum[l[x]];
siz[x]+=siz[l[x]];
lans[x]+=lans[l[x]]*1613u;
rans[x]+=rans[l[x]]*2813u;
lsiz[x]+=lsiz[l[x]]*613u;
rsiz[x]+=rsiz[l[x]]*811u;
}
if(r[x]!=-1){
dfs(r[x]);
sum[x]+=sum[r[x]];
siz[x]+=siz[r[x]];
lans[x]+=lans[r[x]]*2813u;
rans[x]+=rans[r[x]]*1613u;
lsiz[x]+=lsiz[r[x]]*811u;
rsiz[x]+=rsiz[r[x]]*613u;
}
if(l[x]!=-1&&r[x]!=-1&&siz[l[x]]==siz[r[x]]&&lsiz[l[x]]==rsiz[r[x]]&&lsiz[r[x]]==rsiz[l[x]]&&sum[l[x]]==sum[r[x]]&&lans[l[x]]==rans[r[x]]&&lans[r[x]]==rans[l[x]])ans=max(ans,siz[x]);
return;
}
int main(){
//freopen("P5018_17.in","r",stdin);
n=read();
for(int i(1);i<=n;++i)val[i]=read();
for(int i(1);i<=n;++i){
l[i]=read(),r[i]=read();
if(l[i]!=-1)++qwq[l[i]];
if(r[i]!=-1)++qwq[r[i]];
}
for(int i(1);i<=n;++i)if(!qwq[i]){
dfs(i);
printf("%d",ans);
return 0;
}
return 0;
}
不理解,换了模数也是这样,都是结果算大了。子树权值全 1 就有错了。
想知道为什么这么容易被卡,还是本来就有问题。
thx qwq