WA on #4 求调
查看原帖
WA on #4 求调
700558
williamwei楼主2025/6/15 15:25
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1e5 + 10;
const int B = 330;
const int L = 17;
int n, m, tot, head, tail, d[maxn], q[maxn], lg[maxn], dfn[maxn], f[maxn][L];
vector<int> g, e[maxn];
inline int cmp(int x, int y) { return dfn[x] < dfn[y] ? x : y; }
void dfs(int u, int pa) {
	dfn[u] = ++tot; f[tot][0] = pa;
	for (int v : e[u]) if (v != pa) d[v] = d[u] + 1, dfs(v, u);
}
int lca(int u, int v) {
	if (u == v) return u;
	if ((u = dfn[u]) > (v = dfn[v])) swap(u, v);
	int x = lg[v - u++];
	return cmp(f[u][x], f[v - (1 << x) + 1][x]);
}
int main() {
	ios::sync_with_stdio(false);
	cin >> n >> m;
	for (int i = 1; i < n; i++) {
		int u, v; cin >> u >> v;
		e[u].push_back(v); e[v].push_back(u);
	} dfs(1, 0);
	for (int j = 1; j < L; j++)
		for (int i = 1; i <= n - (1 << j) + 1; i++)
			f[i][j] = cmp(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
	for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
	for (int l = 1, r = B; ; l += B, r += B) {
		for (int i = l; i <= min(r, m); i++) {
			int op, x; cin >> op >> x;  if (op == 1) {g.push_back(x); continue;}
			int res = d[x]; for (int v : g) res = min(res, d[x] + d[v] - (d[lca(x, v)] << 1));
			cout << res << '\n';
		} if (r >= m) break;
		head = tail = 1; for (int v : g) q[tail++] = v, d[v] = 0;
		while (head < tail) {
			int u = q[head++];
			for (int v : e[u]) if (d[v] > d[u] + 1)
				d[v] = d[u] + 1, q[tail++] = v;
		} g.clear();
	} return 0;
}
2025/6/15 15:25
加载中...