LCA 0pts 必关。
查看原帖
LCA 0pts 必关。
980130
cleverclever楼主2025/8/29 14:20
#include <bits/stdc++.h>
#define MOD 998244353

using namespace std;

vector<int> tree[300005];
int n, m, deep[300005], father[300005][20];
long long temp[300005], ans[300005][50];

void dfs(int x, int fa)
{
	father[x][0] = fa;
	if (x != 1) deep[x] = deep[fa] + 1;
	if (!ans[x][2])
	{
		for (int i = 1; i <= 50; i++)
			temp[i] = temp[i - 1] * deep[x] % MOD;
		for (int i = 1; i <= 50; i++)
			ans[x][i] = (ans[fa][i] + temp[i]) % MOD;
	}
	for (int i = 1; i <= 19; i++)
		father[x][i] = father[father[x][i - 1]][i - 1];
	
	for (int i = 0; i < tree[x].size(); i++)
	{
		int now = tree[x][i];
		if (now != fa) dfs(now, x);
	}
}

int LCA(int u, int v)
{
	if (deep[u] > deep[v]) swap(u, v);
	
	for (int i = 19; i >= 0; i--)
		if (deep[father[u][i]] >= deep[v])
			u = father[u][i];
	
	if (u == v) return u;
	
	for (int i = 19; i >= 0; i--)
		if (father[u][i] != father[v][i])
			u = father[u][i], v = father[v][i];
	return father[u][0];
}

int main()
{
	cin >> n;
	for (int i = 1; i < n; i++)
	{
		int x, y;
		cin >> x >> y;
		tree[x].push_back(y);
		tree[y].push_back(x);
	}
	cin >> m;
	
	temp[0] = 1;
	dfs(1, 0);
	
	while (m--)
	{
		int i, j, k;
		cin >> i >> j >> k;
		int nearfather = LCA(i, j);
		cout << (ans[i][k] + ans[j][k] + 2 * MOD - ans[nearfather][k] - ans[father[nearfather][0]][k]) % MOD << endl;
	}
	
	return 0;
}

参考第一篇题解。。。全WA。。。QWQ。。。

2025/8/29 14:20
加载中...