社区讨论

求调,思路正确清晰,样例过但0分,(read -))

P4427[BJOI2018] 求和参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mm7rge5t
此快照首次捕获于
2026/03/01 21:03
6 天前
此快照最后确认于
2026/03/04 18:55
4 天前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,MOD=998244353;
vector<int> e[N];
int dep[N],fa[N][21];
long long g[N][51];
void dfs(int s,int f){
	dep[s]=dep[f]+1;
	fa[s][0]=f;
	for(int i=1;i<=20;i++){
		fa[s][i]=fa[fa[s][i-1]][i-1];
	}
	for(int i=0;i<e[s].size();i++){
		int v=e[s][i];
		if(v==f) continue;
		dfs(v,s);
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;i--){
		if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
		if(x==y) return x;
	}
	for(int i=20;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
int main(){
	int n,x,y,k;
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++){
		for(int j=0;j<=50;j++){
			if(j==0) g[i][j]=1;
			else
			g[i][j]=g[i][j-1]*i%MOD;
//			cout<<g[i][j]<<' ';
		}
//		cout<<endl;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=50;j++){
			g[i][j]=(g[i][j]+g[i-1][j])%MOD;
		}
	}
	int m;cin>>m;
	while(m--){
		cin>>x>>y>>k;
		int l=lca(x,y);
		int ans=(g[dep[x]-1][k]-g[dep[l]-1][k]+g[dep[y]-1][k]-g[dep[l]-2][k])%MOD;
		cout<<ans<<endl;
	}
}

回复

0 条回复,欢迎继续交流。

正在加载回复...