萌新蒟蒻求助
查看原帖
萌新蒟蒻求助
232507
OK咯莫名其妙楼主2021/10/5 15:33
#include<bits/stdc++.h>
using namespace std;
const int maxn=2*300005;
const int mod=998244353;
struct node{
	int u,v,nxt;
}edge[maxn];
int head[maxn],tot,n,m,fa[maxn][50],depth[maxn],s,pre[maxn][60];
void add(int u,int v){
	edge[++tot].u=u;
	edge[tot].v=v;
	edge[tot].nxt=head[u];
	head[u]=tot;
}
int qp(int a,int b){
	if(b==0)return 1;
	if(b==1)return a;
	if(b%2==0)return qp(a,b/2)*qp(a,b/2)%mod;
	if(b%2!=0)return a*qp(a,b-1)%mod;
}
void dfs(int x,int fat){
	depth[x]=depth[fat]+1;
	fa[x][0]=fat;
	for(int i=1;i<=50;i++)
	pre[x][i]=pre[fat][i]+qp(depth[x],i);
	for(int i=1;(1<<i)<=depth[x];i++)
		fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i=head[x];i;i=edge[i].nxt){
		int v=edge[i].v;
		if(v!=fat){
			dfs(v,x);
		}
	}
}
int lca(int x,int y){
	if(depth[x]>depth[y])
		swap(x,y);
	for(int i=20;i>=0;i--){
		if(depth[x]<=depth[y]-(1<<i)){
			y=fa[y][i];
		}
	}
	if(x==y) return x;
	for(int i=20;i>=0;i--){
		if(fa[x][i]==fa[y][i])
			continue;
		else
		x=fa[x][i],y=fa[y][i];
	}
	return fa[x][0];
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	dfs(1,0);
	cin>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		int father=lca(x,y);
		int sum1=(pre[x][z]+pre[y][z])%mod;
		int sum2=(pre[father][z]+pre[fa[father][0]][z])%mod;
		cout<<(sum1-sum2)%mod<<endl;
	}
	return 0;
}
2021/10/5 15:33
加载中...