我用的是树上差分,不知道为什么就10pts了,给个反例也彳亍
#include<bits/stdc++.h>
using namespace std;
#define F(i,l,r) for(int i=l;i<=r;i++)
#define p_b push_back
const int N=3e5+5;
int n,u,v;
int a[N],sum[N];
int fa[N][43],dep[N];
vector<int> mp[N];
void dfs(int s) {
dep[s]=dep[fa[s][0]]+1;
F(i,0,30) fa[s][i+1]=fa[fa[s][i]][i];
F(i,0,(int)mp[s].size()-1) {
int to=mp[s][i];
if(!dep[to]) {
fa[to][0]=s;
dfs(to);
}
}
}
int Lca(int x,int y) {
if(dep[x]>dep[y]) swap(x,y);
for(int i=30;i>=0;i--) if(dep[fa[y][i]]>=dep[x]) y=fa[y][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];
}
void dfs_sum(int s) {
F(i,0,(int)mp[s].size()-1){
int to=mp[s][i];
if(to!=fa[s][0]) {
dfs_sum(to);
sum[s]+=sum[to];
}
}
}
int main(){
scanf("%d",&n);
F(i,1,n) scanf("%d",&a[i]);
F(i,1,n-1) {
scanf("%d%d",&u,&v);
mp[u].p_b(v);
mp[v].p_b(u);
}
dfs(1);
F(i,1,n-1) {
sum[a[i]]++,sum[a[i+1]]++;
int x=Lca(a[i],a[i+1]);
sum[x]--,sum[fa[x][0]]--;
}
dfs_sum(1);
F(i,1,n) printf("%d\n",sum[i]-(i==1?0:1));
return 0;
}