社区讨论

why re,调出来有 rmb

P4427[BJOI2018] 求和参与者 3已保存回复 5

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@m00o0896
此快照首次捕获于
2024/08/19 15:18
2 年前
此快照最后确认于
2024/08/19 16:52
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
#define reg register
#define N 300005
using namespace std;
ll n,m,u,v,w,root=1;
ll dep[N],sum[50][N],lg[N],fa[N][55];
vector<ll> edge[N];
inline ll read(){
	ll f=1,s=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=(s<<3)+(s<<1)+ch-48;
		ch=getchar();
	}
	return f*s;
}
ll qpow(ll x,ll base){
	ll ans=1;
	while(base){
		if(base&1) ans=ans*(x%mod)%mod;
		base>>=1;
		x=x%mod*x%mod;
	}
	return ans;
}
void dfs1(ll u,ll f){
	dep[u]=dep[f]+1;
	fa[u][0]=f;
	for(reg ll i=1;i<=lg[dep[u]];i++)
		fa[u][i]=fa[fa[u][i-1]][i-1];
	for(reg ll v : edge[u])
		if(v!=f) dfs1(v,u);
}
void dfs2(ll u,ll f,ll k){
	sum[k][u]=(sum[k][f]+qpow(dep[u],k)%mod)%mod;
	for(reg ll v : edge[u])
		if(v!=f) dfs2(v,u,k);
}
ll lca(ll u,ll v){
	if(dep[u]<dep[v])
		swap(u,v);
	while(dep[u]>dep[v])
		u=fa[u][lg[dep[u]-dep[v]]-1];
	if(u==v) return u;
	for(reg ll k=lg[dep[u]]-1;k>=0;k--){
		if(fa[u][k]!=fa[v][k])
			u=fa[u][k],v=fa[v][k];
	}
	return fa[u][0];
}
int main(){
	n=read();
	for(reg ll i=1;i<n;i++){
		u=read(),v=read();
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	for(reg ll i=1;i<=n;i++)
		lg[i]=lg[i>>1]+1;
	dep[0]=-1;
	dfs1(root,0);
	for(reg ll i=1;i<=50;i++)
		dfs2(root,0,i);
	m=read();
	for(reg ll i=1;i<=m;i++){
		u=read(),v=read(),w=read();
		printf("%lld\n",(mod+sum[w][u]+sum[w][v]-2*sum[w][fa[lca(u,v)][0]])%mod);
	}
	return 0;
}

回复

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

正在加载回复...