hash,但是为什么这么容易被卡,还是本来就有错,求调
查看原帖
hash,但是为什么这么容易被卡,还是本来就有错,求调
511609
无钩七不改名楼主2024/9/27 18:10

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

2024/9/27 18:10
加载中...