RT,下面是代码,悬关求调
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=3e5+5;
ll n,a[MAXN],cnt,d[MAXN];
ll dfn[MAXN],st[MAXN][20];
vector<ll>e[MAXN];
ll check(ll x,ll y){return dfn[x]<dfn[y]?x:y;}
void dfs(ll id,ll fa){
st[(dfn[id]=++cnt)][0]=fa;
for(ll it : e[id])if(it!=fa)dfs(it,id);
}
ll lca(ll u,ll v){
if(u==v)return u;
if((u=dfn[u])>(v=dfn[v]))swap(u,v);
ll k=log2(v-u++);
return check(st[u][k],st[v-(1<<k)+1][k]);
}
void Answer(ll id,ll fa){
for(ll it : e[id]){
if(it!=fa){
Answer(it,id);
d[id]+=d[it];
}
}
}
int main()
{
cin>>n;
for(ll i=1;i<=n;i++)cin>>a[i];
for(ll i=1,u,v;i<n;i++){
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs(1,0);
for(ll i=1;i<=n;i++)
for(ll j=1;i+(1<<j)-1<=n;j++)
st[i][j]=check(st[i][j-1],st[i+(1<<j-1)][j-1]);
for(ll i=1,u,v;i<n;i++){
u=a[i],v=a[i+1];
ll LCA=lca(u,v);
d[u]++;
d[v]++;
d[LCA]--;
d[st[dfn[LCA]][0]]--;
}
Answer(1,0);
for(ll i=2;i<=n;i++)d[a[i]]--;
for(ll i=1;i<=n;i++)cout<<d[i]<<"\n";
return 0;
}