全部re
查看原帖
全部re
503792
Svemit楼主2022/12/21 08:30

rt样例输出276 640187589

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+5,mod=998244353;
int n,m,cnt,idx;
int head[N],dep[N],fa[N],son[N],siz[N],top[N],id[N],a[N];
ll f[N][51];
struct edge
{
	int next,to;
}e[N<<1];
struct segment_tree
{
	int l,r,val[51];
}t[N<<2];

void add_edge(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}

void push_up(int x)
{
	for(int i=0;i<=50;i++)
	  t[x].val[i]=(t[x<<1].val[i]+t[x<<1|1].val[i])%mod;
}

void build(int l,int r,int x)
{
	t[x].l=l;
	t[x].r=r;
	if(l==r)
	{
		for(int i=0;i<=50;i++)
		  t[x].val[i]=f[dep[a[l]]][i];
		return;
	}
	int mid=l+r>>1;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	push_up(x);
}

int query(int nl,int nr,int k,int l,int r,int x)
{
	if(nl<=l&&r<=nr)
	{
		return t[x].val[k];
	}
	int mid=l+r>>1,res=0;
	if(nl<=mid) res+=query(nl,nr,k,l,mid,x<<1)%mod;
	if(nr>mid) res+=query(nl,nr,k,mid+1,r,x<<1|1)%mod;
	return res%mod;
}

void dfs1(int u,int fath)
{
	dep[u]=dep[fath]+1;
	fa[u]=fath;
	siz[u]=1;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].to;
		if(v==fath) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]])
		  son[u]=v;
	}
}

void dfs2(int u,int fst)
{
	id[u]=++idx;
	a[idx]=u;
	top[u]=fst;
	if(!son[u]) return;
    dfs2(son[u],fst);
    for(int i=head[u];i;i=e[i].next)
    {
    	int v=e[i].to;
    	if(v==fa[u]||v==son[u]) continue;
    	dfs2(v,v);
	}
}

int trlist_query(int u,int v,int k)
{
	int res=0;
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		res+=query(id[top[u]],id[u],k,1,n,1);
		res%=mod;
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	res+=query(id[u],id[v],k,1,n,1);
	res%=mod;
	return res;
}

void pow_init()
{
	for(int i=1;i<=N;i++)
	  f[i][0]=1;
	for(int i=1;i<=N;i++)
	  for(int j=1;j<=50;j++)
	    f[i][j]=(f[i][j-1]*i)%mod;
}

signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		add_edge(u,v);
		add_edge(v,u);
	}
	dfs1(1,0);
	dfs2(1,1);
	pow_init();
	build(1,n,1);
	cin>>m;
	while(m--)
	{
		int u,v,k;
		cin>>u>>v>>k;
		cout<<trlist_query(u,v,k)<<'\n';
	}
	return 0;
}

2022/12/21 08:30
加载中...