社区讨论

10分,ac第一个点求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lvkweaea
此快照首次捕获于
2024/04/29 19:50
2 年前
此快照最后确认于
2024/04/29 21:52
2 年前
查看原帖
崩溃了
CPP
#include<bits/stdc++.h>
#define mod 998244353
#define int long long
using namespace std;
int n,m,t,d[300005][51],f[500500][29],jimmy,s[300005][51],ans,sum,fa[300005];
vector<int> g[500005];
void dfs(int u,int fa,int p)
{	d[u][1]=p-1;
	f[u][0]=fa;
	for(int j=1;j<=t;j++)
	f[u][j]=f[f[u][j-1]][j-1];
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==fa) continue;
		dfs(v,u,p+1);		
	}
}
int lca(int u,int v)
{
	if(d[u][1]>d[v][1]) swap(u,v);
	for(int i=t;i>=0;i--)
		if(d[f[v][i]][1]>=d[u][1]) v=f[v][i];
	if(u==v) return u;
	for(int i=t;i>=0;i--)
		if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
	return f[u][0];
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n;
	t=log2(n)+1;
	for(int i=1;i<n;i++)
	{
		int u,v;	
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
		fa[v]=u;
	}
	d[1][1]=0;
	dfs(1,0,1);
	for(int i=2;i<=50;i++)
	{
		for(int j=2;j<=n;j++)
		{
			d[j][i]=d[j][i-1]*d[j][1]%mod;
			s[j][i]=(s[fa[j]][i]+d[j][i])%mod;
		}
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y,jim;
		cin>>x>>y>>jim;
		cout<<(s[x][jim]+s[y][jim]-s[lca(x,y)][jim]*2+d[lca(x,y)][jim]+mod)%mod<<'\n';
	}
	return 0; 
}

回复

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

正在加载回复...