换了个数组就从10->100?
查看原帖
换了个数组就从10->100?
123078
C_Z_C楼主2021/8/8 20:02

100分代码:

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int rea(){
	int s=0;
	char c=getchar();
	while(c>'9'||c<'0') c=getchar();
	while(c>='0'&&c<='9') s=s*10+c-'0',c=getchar();
	return s;
}
struct Edge{
	int u,v;
}edge[600005];
int n,m,top,head[300005],pre[300005][20],d[300005],sum[300005][55],mod=998244353;
void add(int x,int y){
	edge[++top].u=head[x];
	edge[top].v=y;
	head[x]=top;
}
void dfs(int x,int last){
	for(int i=head[x];i;i=edge[i].u){
		int to=edge[i].v;
		if(to!=last){
			d[to]=d[x]+1;
			int tmp=1;
			for(int j=1;j<=50;j++){
				tmp=((ll)tmp*d[to])%mod;
				sum[to][j]=((ll)tmp+sum[x][j])%mod;
			}
			pre[to][0]=x;
			dfs(to,x);
		}
	}
}
void ST(){
	for(int i=1;(1<<i)<=n;i++)
		for(int j=1;j<=n;j++) pre[j][i]=pre[pre[j][i-1]][i-1];
}
int lca(int x,int y){
	if(d[x]<d[y]) swap(x,y);
	int dx=d[x],dy=d[y],k=0;
	while((dy+(1<<k+1))<=dx) k++;
	for(int i=k;i>=0;i--){
		if((dx-(1<<i))>=dy) dx-=(1<<i),x=pre[x][i];
	}
	if(x==y) return x;
	k=0;
	while((1<<k+1)<=dx) k++;
	for(int i=k;i>=0;i--){
		if(pre[x][i]!=pre[y][i]) x=pre[x][i],y=pre[y][i];
	}
	return pre[x][0];
}
int main(){
	n=rea();
	for(int i=1;i<n;i++){
		int x,y;
		x=rea(); y=rea();
		add(x,y); add(y,x);
	}
	m=rea();
	dfs(1,1);
	ST();
	for(int i=1;i<=m;i++){
		int x,y,k,ans;
		x=rea(); y=rea(); k=rea();
		int l=lca(x,y);
		ans=(sum[x][k]+sum[y][k])%mod;
		ans-=(sum[l][k]+sum[pre[l][0]][k])%mod;
		cout<<(ans+mod)%mod<<'\n';
	}
	return 0;
}

10代码:

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int rea(){
	int s=0;
	char c=getchar();
	while(c>'9'||c<'0') c=getchar();
	while(c>='0'&&c<='9') s=s*10+c-'0',c=getchar();
	return s;
}
struct Edge{
	int u,v;
}edge[600005];
int n,m,top,head[300005],pre[300005][20],d[300005][55],sum[300005][55],mod=998244353;
void add(int x,int y){
	edge[++top].u=head[x];
	edge[top].v=y;
	head[x]=top;
}
void dfs(int x,int last){
	for(int i=head[x];i;i=edge[i].u){
		int to=edge[i].v;
		if(to!=last){
			d[to][1]=d[x][1]+1;
			for(int j=2;j<=50;j++){
				d[to][j]=((ll)d[to][j-1]*d[to][1])%mod;
				sum[to][j]=((ll)d[to][j]+sum[x][j])%mod;
			}
			pre[to][0]=x;
			dfs(to,x);
		}
	}
}
void ST(){
	for(int i=1;(1<<i)<=n;i++)
		for(int j=1;j<=n;j++) pre[j][i]=pre[pre[j][i-1]][i-1];
}
int lca(int x,int y){
	if(d[x][1]<d[y][1]) swap(x,y);
	int dx=d[x][1],dy=d[y][1],k=0;
	while((dy+(1<<k+1))<=dx) k++;
	for(int i=k;i>=0;i--){
		if((dx-(1<<i))>=dy) dx-=(1<<i),x=pre[x][i];
	}
	if(x==y) return x;
	k=0;
	while((1<<k+1)<=dx) k++;
	for(int i=k;i>=0;i--){
		if(pre[x][i]!=pre[y][i]) x=pre[x][i],y=pre[y][i];
	}
	return pre[x][0];
}
int main(){
	n=rea();
	for(int i=1;i<n;i++){
		int x,y;
		x=rea(); y=rea();
		add(x,y); add(y,x);
	}
	m=rea();
	dfs(1,1);
	ST();
	for(int i=1;i<=m;i++){
		int x,y,k,ans;
		x=rea(); y=rea(); k=rea();
		int l=lca(x,y);
		ans=(sum[x][k]+sum[y][k])%mod;
		ans-=(2*sum[l][k])%mod;
		ans=(ans+d[l][k])%mod;
		cout<<(ans+mod)%mod<<'\n';
	}
	return 0;
}

RT,我只改了记录深度的d数组和最后计算ans的方法,貌似没有不同,为什么会有这么大的差异?卡了我几个小时

2021/8/8 20:02
加载中...