社区讨论

LCA #11 WA 求调

CF379FNew Year Tree参与者 554已保存回复 750

讨论操作

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

当前回复
747 条
当前快照
1 份
快照标识符
@lz4yrge0
此快照首次捕获于
2024/07/28 10:51
2 年前
此快照最后确认于
2025/12/16 13:52
2 个月前
查看原帖
CPP

#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 5e5 + 11;
int n, q, x, dep[N], dp[N][21], l, r, len;
int lca (int x, int y){
	if (dep[y] < dep[x]) swap (x, y);
	for (int i = 20; i >= 0; --i){
		if (dep[dp[y][i]] >= dep[x]) y = dp[y][i];
	}
	if (x == y) return x;
	for (int i = 20; i >= 0; --i){
		if (dp[x][i] != dp[y][i]){
			x = dp[x][i];
			y = dp[y][i];
		}
	}
	return dp[x][0];
}
int dis (int x, int y){
	return dep[x] + dep[y] - 2 * dep[lca (x, y)];
}
signed main (){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> q;
	n = 4;
	l = 2, r = 4, len = 2;
	dp[2][0] = dp[3][0] = dp[4][0] = 1;
	dep[1] = 1, dep[2] = dep[3] = dep[4] = 2;
	while (q --){
		cin >> x;
		dep[n + 1] = dep[x] + 1;
		dp[n + 1][0] = x;
		for (int i = 1; (1 << i) <= dep[n + 1]; ++i) dp[n + 1][i] = dp[dp[n + 1][i - 1]][i - 1];
		dep[n + 2] = dep[x] + 1;
		dp[n + 2][0] = x;
		for (int i = 1; (1 << i) <= dep[n + 2]; ++i) dp[n + 2][i] = dp[dp[n + 2][i - 1]][i - 1];
		if (dis (n + 1, l) > dis (l, r)){
			r = n + 1;
			len = dis (l, r);
		}else if (dis(n + 1, r) > dis (l, r)){
			l = n + 1;
			len = dis (l, r);
		}
		n += 2;
		cout << len << '\n';
	}
	return 0;
}

回复

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

正在加载回复...