社区讨论
T了全部。。求条
P3258[JLOI2014] 松鼠的新家参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjag2g8
- 此快照首次捕获于
- 2025/11/03 23:21 4 个月前
- 此快照最后确认于
- 2025/11/03 23:21 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int MAX = 300005;
const int MAXX = MAX << 1;
int n,m,a[MAX],head[MAX],cnt;
struct egde{
int u,v,next;
}e[MAXX];
void add(int u,int v){
e[cnt++].u = u;
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
}
int fa[MAX][31],dep[MAX];
void dfs(int u,int f){
fa[u][0] = f;
dep[u] = dep[f] + 1;
for(int i = 1;i <= 30; i++)
fa[u][i] = fa[fa[u][i-1]][i-1];
for(int i = head[u];i;i = e[i].next){
int v = e[i].v;
if(v == f)
continue;
dfs(v,u);
}
}
int lca(int x,int y){
if(dep[x] < dep[y])
swap(x,y);
for(int i = 30;i >= 0; i--){
if(dep[fa[x][i]] >= dep[y])
x = fa[x][i];
}
if(x == y)
return x;
for(int i = 30;i >= 0;i --){
if(fa[x][i] != fa[y][i]){
x = fa[x][i];
y = fa[y][i];
}
}
return fa[x][0];
}
int num[MAX];
int answer(int u,int f){
for(int i = head[u];i;i = e[i].next){
int v = e[i].v;
if(v == f)
continue;
answer(v,u);
num[u] += num[v];
}
}
int main(){
cin >> n;
for(int i = 1;i <= n; i++)
cin >> a[i];
int t1,t2;
for(int i = 1;i < n; i ++){
cin >> t1 >> t2;
add(t1,t2);
add(t2,t1);
}
dfs(1,0);
for(int i = 1;i < n; i++){
int u = a[i],v = a[i+1];
int t = lca(u,v);
num[fa[t][0]] -= 1;
num[t] -= 1;
num[u] += 1;
num[v] += 1;
}
answer(1,0);
for(int i = 2;i <= n; i++)
num[a[i]] --;
for(int i = 1;i <= n; i++)
cout << num[i] << "\n";
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...