社区讨论
MnZn 树上差分求助
P3258[JLOI2014] 松鼠的新家参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lobc0ter
- 此快照首次捕获于
- 2023/10/29 18:32 2 年前
- 此快照最后确认于
- 2023/11/04 00:20 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=2*500005;
struct node{
int u,v;
int nxt;
}edge[maxn];
int head[maxn],tot,depth[maxn],fa[maxn][50];
int n,m,s;
int a[500005];
int num[maxn];
void add(int u,int v){
edge[++tot].u=u;
edge[tot].v=v;
edge[tot].nxt=head[u];
head[u]=tot;
}
void dfs(int u,int fat){
depth[u]=depth[fat]+1;
fa[u][0]=fat;
for(int i=1;(1<<i)<=depth[u];i++)
{
fa[u][i]=fa[fa[u][i-1]][i-1];
}
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v;
if(v!=fat){
dfs(v,u);
}
}
}
int lca(int x,int y){
if(depth[x]>depth[y])
swap(x,y);
for(int i=20;i>=0;i--){
if(depth[x]<=depth[y]-(1<<i))
y=fa[y][i];
}
if(x==y)
return x;
for(int i=20;i>=0;i--){
if(fa[x][i]==fa[y][i])
continue;
else
x=fa[x][i],y=fa[y][i];
}
return fa[x][0];
}
void answer(int u,int fa){
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v;
if(v!=fa){
answer(v,u);
num[u]+=num[v];
}
}
return ;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n-1;i++){
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
for(int i=1;i<=n-1;i++)
{
int u=a[i];
int v=a[i-1];
int lcaa=lca(u,v);
num[u]++;
num[v]++;
num[lcaa]--;
num[fa[lcaa][0]]--;
}
answer(1,0);
for(int i=1;i<=n;i++)num[a[i]]--;
num[a[1]]++;
for(int i=1;i<=n;i++)
cout<<num[i]<<endl;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...