社区讨论
求大佬,看看,全部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 条回复,欢迎继续交流。
正在加载回复...