社区讨论
WA10pts求条
P3258[JLOI2014] 松鼠的新家参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjhr7n8
- 此快照首次捕获于
- 2025/11/04 02:46 4 个月前
- 此快照最后确认于
- 2025/11/04 02:46 4 个月前
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 300010;
int n , m , fa[N][30] , dep[N] , f[N] , ans;
vector <int> v[N];
void build (int id , int f) {
fa[id][0] = f; dep[id] = dep[f] + 1;
for (int i = 1;i <= 25;i ++) {
fa[id][i] = fa[fa[id][i - 1]][i - 1];
}
for (int i = 0;i < v[id].size();i ++) {
if (v[id][i] == f) continue;
build (v[id][i] , id);
}
return;
}
int LCA (int x , int y) {
if (dep[x] < dep[y]) swap (x , y);
int d = dep[x] - dep[y];
for (int i = 25;i >= 0;i --) {
if (d & (1 << i)) {
x = fa[x][i];
}
}
if (x == y) return x;
for (int i = 25;i >= 0;i --) {
if (fa[x][i] != fa[y][i]) {
x = fa[x][i]; y = fa[y][i];
}
}
return fa[x][0];
}
void dfs (int id) {
for (int i = 0;i < v[id].size();i ++) {
if (v[id][i] == fa[id][0]) continue;
dfs (v[id][i]);
f[id] += f[v[id][i]];
}
return;
}
int b[N];
signed main () {
cin >> n;
for (int i = 1;i <= n;i ++) cin >> b[i];
for (int i = 1;i < n;i ++) {
int x , y;
cin >> x >> y;
v[x].push_back (y);
v[y].push_back (x);
}
build (1 , 0);
for (int i = 1;i < n;i ++) {
int h = LCA (b[i] , b[i + 1]);
f[b[i]] ++; f[b[i + 1]] ++; f[h] --;
f[fa[h][0]] --;
}
dfs (1);
// for (int i = 1;i <= n;i ++) {
// ans = max (ans , f[i]);
// //cout << f[i] << '\n';
// }
cout << f[1] << '\n';
for (int i = 2;i <= n;i ++) cout << f[i] - 1 << '\n';
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...