社区讨论
10pts求助,救救孩子(
P3258[JLOI2014] 松鼠的新家参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lockjj4f
- 此快照首次捕获于
- 2023/10/30 15:18 2 年前
- 此快照最后确认于
- 2023/11/05 02:31 2 年前
A了一个点,还有一个点mle,希望大佬看看问题
CPP#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long f[500010][50];
long long depth[500010];
long long log[500010];
long long num[500010];
long long n;
long long a[500010];
vector<long long> g[500010];
bool vis[500010];
void dfs(long long fa,long long v,long long dpth){
depth[v] = dpth;
for(long long i = 1;i <= log[dpth];i++){
f[v][i] = f[f[v][i-1]][i-1];
}
for(long long i = 0;i<g[v].size();i++){
if(g[v][i] == fa)continue;
f[g[v][i]][0] = v;
dfs(v,g[v][i],dpth+1);
}
}
long long lca(long long u,long long v){
long long x = u;
long long y = v;
if(depth[x]<depth[y])swap(x,y);
while(depth[x]>depth[y]){
x = f[x][log[depth[x]-depth[y]]-1];
}
if(x == y )return x;
for(long long k = log[depth[x]]-1;k>=0;--k){
if(f[x][k] != f[y][k]){
x = f[x][k];
y = f[y][k];
}
}
return f[x][0];
}
void dfs2(long long fa,long long node){
for(long long i = 0;i<g[node].size();i++){
if(g[node][i] == fa)continue;
dfs2(node,g[node][i]);
}
num[fa] += num[node];
}
int main(){
cin>>n;
for(long long i =1;i<=n;i++){
cin>>a[i];
if(i>1)vis[a[i]] = 1;
}
for(long long i = 1;i<n;i++){
long long x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
for(long long i = 1;i<=n;i++){
log[i] = log[i-1] + (1 << log[i-1] == i);
}
dfs(0,a[1],1);
for(long long i = 1;i<=n-1;i++){
long long l = lca(a[i],a[i+1]);
num[a[i]]++;
num[a[i+1]]++;
num[l]--;
num[f[l][0]]--;
}
dfs2(0,a[1]);
for(long long i = 1;i<=n;i++){
cout<<num[i]-vis[a[i]]<<endl;
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...