树剖 24 分求助
查看原帖
树剖 24 分求助
448887
cancan123456楼主2023/1/16 11:09
#include <cstdio>
using namespace std;
const int N = 1000005;
struct Edge {
	int v, next;
} edge[2 * N];
int head[N];
int cnt;
void add_edge(int u, int v) {
	cnt++;
	edge[cnt].v = v;
	edge[cnt].next = head[u];
	head[u] = cnt;
}
int fa[N], dep[N], size[N], son[N];
void dfs1(int u, int fa) {
	::fa[u] = fa;
	dep[u] = dep[fa] + 1;
	size[u] = 1;
	for (int v, i = head[u]; i != 0; i = edge[i].next) {
		v = edge[i].v;
		if (v != fa) {
			dfs1(v, u);
			size[u] += size[v];
			if (size[son[u]] < size[v]) {
				son[u] = v;
			}
		}
	}
}
int top[N], dfn[N], timer, seq[N];
void dfs2(int u, int toplink) {
	top[u] = toplink;
	timer++;
	dfn[u] = timer;
	seq[timer] = u;
	if (son[u] != 0) {
		dfs2(son[u], toplink);
		for (int v, i = head[u]; i != 0; i = edge[i].next) {
			v = edge[i].v;
			if (v != fa[u] && v != son[u]) {
				dfs2(v, v);
			}
		}
	}
}
int LCA(int u, int v) {
	while (top[u] != top[v]) {
		if (dep[top[u]] < dep[top[v]]) {
			u ^= v ^= u ^= v;
		}
		u = fa[top[u]];
	}
	return dep[u] < dep[v] ? u : v;
}
int ancestor(int u, int k) {
	while (true) {
		if (k <= dep[u] - dep[top[u]]) {
			break;
		}
		k -= dep[u] - dep[fa[top[u]]];
		u = fa[top[u]];
	}
	return seq[dfn[u] - k];
}
int main() {
	int n, u, q;
	scanf("%d %d %d", &n, &u, &q);
	for (int u, v, i = 1; i < n; i++) {
		scanf("%d %d", &u, &v);
		add_edge(u, v);
		add_edge(u, v);
	}
	dfs1(1, 0);
	dfs2(1, 1);
	for (int v, p, t, d1, d2; q != 0; q--) {
		scanf("%d %d", &v, &t);
		p = LCA(u, v);
		d1 = dep[u] - dep[p];
		d2 = dep[v] - dep[p];
		if (t >= d1 + d2) {
			u = v;
		} else if (t >= d1) {
			u = ancestor(v, d1 + d2 - t);
		} else {
			u = ancestor(u, t);
		}
		printf("%d ", u);
	}
	return 0;
}
2023/1/16 11:09
加载中...