社区讨论

求大佬,看看,全部Re

P2633Count on a tree参与者 3已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi6v27rm
此快照首次捕获于
2025/11/20 11:17
4 个月前
此快照最后确认于
2025/11/20 11:17
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 7;
int n, m, dep[maxn], F[maxn][20], ls[maxn * 40], rs[maxn * 40], sum[maxn * 40];
int a[maxn], b[maxn], tot, cnt = 1, id, rt[maxn];
struct Node {int v, nxt;} G[maxn << 1]; int head[maxn];

void ins(int u, int v) {
	G[cnt] = (Node) {v, head[u]}; head[u] = cnt++;
}
void Modify(int &o, int lst, int l, int r, int ql) {
	o = ++id; ls[o] = ls[lst]; rs[o] = rs[lst]; sum[o] = sum[lst] + 1;
	if(l == r) return;
	int mid = (l + r) >> 1;
	if(ql <= mid) Modify(ls[o], ls[lst], l, mid, ql);
	else Modify(rs[o], rs[lst], mid + 1, r, ql);
}
void dfs(int x, int fa, int deep) {
	dep[x] = deep; F[x][0] = fa;
	Modify(rt[x], rt[fa], 1, tot, a[x]);
	for (int i = 1; i <= 20 && F[F[x][i - 1]][i - 1]; ++i) F[x][i] = F[F[x][i - 1]][i - 1];
	for (int i = head[x]; i; i = G[i].nxt) {
		int v = G[i].v; if(v == fa) continue;
		dfs(v, x, deep + 1);
	}
}
int Query(int x, int y, int z, int v, int l, int r, int ql) {
	if(l == r) return l;
	int mid = (l + r) >> 1, res = sum[ls[x]] + sum[ls[y]] - sum[ls[z]] - sum[ls[v]];
	if(ql <= res) return Query(ls[x], ls[y], ls[z], ls[v], l, mid, ql);
	else return Query(rs[x], rs[y], rs[z], rs[v], mid + 1, r, ql - res);
}
int LCA(int x, int y) {
	if(dep[x] < dep[y]) swap(x, y);
	for (int i = 20; i >= 0; --i) if(dep[F[x][i]] >= dep[y]) swap(x, y);
	if(x == y) return x;
	for (int i = 20; i >= 0; --i) if(F[x][i] != F[y][i]) x = F[x][i], y = F[y][i];
}
int main() {
	scanf("%d%d", &n, &m); tot = n;
	for (int i = 1; i <= n; ++i) scanf("%d", &a[i]), b[i] = a[i];
	sort(b + 1, b + tot + 1);
	tot = unique(b + 1, b + tot + 1) - b - 1;
	for (int i = 1; i <= n; ++i) a[i] = lower_bound(b + 1, b + tot + 1, a[i]) - b;
	for (int i = 1; i <= n - 1; ++i) {
		int x, y; scanf("%d%d", &x, &y);
		ins(x, y); ins(y, x);
	} dfs(1, 0, 1); int lst = 0;
	while(m--) {
		int u, v, k; scanf("%d%d%d", &u, &v, &k); u ^= lst;
		int lca = LCA(u, v);
		printf("%d\n", lst = b[Query(rt[u], rt[v], rt[lca], rt[F[lca][0]], 1, tot, k)]);
	}
	return 0;
}

回复

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

正在加载回复...