社区讨论

TLE 100pts求条 玄关

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mlqgb1yy
此快照首次捕获于
2026/02/17 18:19
前天
此快照最后确认于
2026/02/18 16:00
23 小时前
查看原帖
CPP
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
const int MAXN = 3e5 + 5;
const int LOG = 20;
const int MOD = 998244353;
int n;
vector<int> g[MAXN];
int sum[MAXN][55], dep[MAXN];
ll quick_pow(int a, int b) {
	if (b == 0) return 1;
	if (b == 1) return a;
	ll k = quick_pow(a, b / 2);
	if (b % 2 == 0) {
		return k * k % MOD; 
	} else {
		return k * k % MOD * a % MOD;
	}
}
void addEdge(int u, int v) {
	g[u].push_back(v);
	g[v].push_back(u);
}
void prepare(int u, int pa, int k, bool flag) {
	if (flag) dep[u] = dep[pa] + 1;
	sum[u][k] = (sum[pa][k] + quick_pow(dep[u], k)) % MOD;
	for (int v : g[u]) {
		if (v != pa) {
			prepare(v, u, k, flag);
		}
	}
}
struct LCA {
	int fa[MAXN][LOG];
	void dfs(int u, int pa) {
		fa[u][0] = pa;
		for (int i = 1; i < LOG; i++) {
			fa[u][i] = fa[fa[u][i - 1]][i - 1];
		}
		for (int v : g[u]) {
			if (v != pa) {
				dfs(v, u);
			}
 		}
	}
	int lca(int u, int v) {
		if (dep[u] < dep[v]) swap(u, v);
		for (int i = LOG - 1; i >= 0; i--) {
			if (dep[fa[u][i]] >= dep[v]) {
				u = fa[u][i];
			}
		}
		if (u == v) return u;
		for (int i = LOG - 1; i >= 0; i--) {
			if (fa[u][i] != fa[v][i]) {
				u = fa[u][i], v = fa[v][i];
			}
		}
		return fa[u][0];
	}
}l;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n;
	for (int i = 1; i < n; i++) {
		int u, v;
		cin >> u >> v;
		addEdge(u, v);
	}
	for (int i = 1; i <= 50; i++) {
		dep[0] = -1;
		prepare(1, 0, i, i == 1);
	}
	l.dfs(1, 0);
	int q;
	cin >> q;
	while (q--) {
		int u, v, k;
		cin >> u >> v >> k;
		int L = l.lca(u, v);
		ll ans = (sum[u][k] + sum[v][k]) % MOD;
		ans = (ans - sum[L][k] + MOD) % MOD;
		if (l.fa[L][0]) ans = (ans - sum[l.fa[L][0]][k] + MOD) % MOD;
		cout << ans << endl;
	}
	return 0;
}

毒瘤卡常题。

回复

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

正在加载回复...