样例没过,求调,玄关
查看原帖
样例没过,求调,玄关
1285611
JiangMzz楼主2024/8/11 22:58
#include <bits/stdc++.h>
using namespace std;
int n;
int a[300001];
vector<int> p[300001];
int son[300001];
int f[300001];
int siz[300001];
int dep[300001];
void dfs(int x, int fa) {
	siz[x] = 1;
	f[x] = fa;
	dep[x] = dep[fa] + 1;
	for (int i = 0; i < p[x].size(); i++) {
		if (p[x][i] == fa) continue;
		dfs(p[x][i], x);
		siz[x] += siz[p[x][i]];
		if (siz[son[x]] < siz[p[x][i]])
			son[x] = p[x][i];
	}
	return;
}
int top[300001];
void dfs2(int x, int tp) {
	top[x] = tp;
	if (!son[x]) return;
	dfs2(son[x], tp);
	for (int i = 0; i < p[x].size(); i++) {
		if (p[x][i] == f[x] || p[x][i] == son[x]) continue;
		dfs2(p[x][i], p[x][i]);
	}
	return;
}
int LCA(int x, int y) {
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]]) 
			swap(x, y);
		x = f[top[x]];
	}
	if (dep[x] < dep[y]) return x;
	else return y;
}
int val[300001];
void solve(int x, int y) {
	int lca = LCA(x, y);
	val[x]++;
	val[y]++;
	val[lca]--;
	val[f[lca]]--;
	return;
}
void add(int x, int fa) {
	for (int i = 0; i < p[x].size(); i++) {
		if (p[x][i] == fa) continue;
		add(p[x][i], x);
		val[x] += val[p[x][i]];
	}
	return;
}
int main() {
	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;
		p[x].push_back(y);
		p[y].push_back(x);
	}
	dfs(1, 0);
	dfs2(1, 1);
	for (int i = 2; i <= n; i++) {
		solve(a[i - 1], a[i]);
		val[a[i]]--;
	}
	add(1, 0);
	val[n] = 0;
	for (int i = 1; i <= n; i++)
		cout << val[i] << " ";
	return 0;
}
2024/8/11 22:58
加载中...