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