超的这篇:https://www.luogu.com.cn/article/ecppsp41
#include <bits/stdc++.h> //https://www.luogu.com.cn/article/ecppsp41
#define int long long
using namespace std;
const int maxn = 300005;
int a[maxn], head[maxn], cnt;
struct Edge {
int u, v, nxt;
} e[maxn * 2];
void add(int u, int v) {
e[++cnt].u = u;
e[cnt].v = v;
e[cnt].nxt = head[u];
head[u] = cnt;
}
int fa[maxn][31], dep[maxn];
void dfs(int u, int fath) {
fa[u][0] = fath; dep[u] = dep[fath] + 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].nxt) {
int v = e[i].v;
if (v != fath) 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[maxn];
int answer(int u, int fath) {
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].v;
if (v != fath) {
answer(v, u);
num[u] += num[v];
}
}
}
signed main() {
cin.tie(0); ios::sync_with_stdio(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
add(x, y);
add(y, x);
}
dfs(1, 0);
for (int i = 1; i < n; i++) {
int u = a[i], v = a[i + 1];
int lca = LCA(u, v);
num[u]++; num[v]++;
num[lca]--; num[fa[lca][0]]--;
}
answer(1, 0);
for (int i = 2; i <= n; i++) num[a[i]]--;
for (int i = 1; i <= n; i++) cout << num[i] << "\n";
}