社区讨论
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 条回复,欢迎继续交流。
正在加载回复...