倍增求lca,0pts,全wa求条
查看原帖
倍增求lca,0pts,全wa求条
975724
Sine_Func楼主2024/12/14 11:28
#include<bits/stdc++.h>
#define N 300010
using namespace std;
vector<int>e[N];
int dep[N], n, m, x, y, fa[N][30], a[N], s[N];
void build(int x) {
	for (int i = 1; i <= 20; i++)fa[x][i] = fa[fa[x][i - 1]][i - 1];
	for (auto i : e[x]) {
		if (i == fa[x][0])continue;
		fa[i][0] = x;
		dep[i] = dep[x] + 1;
		build(i);
	}
}
int lca(int u, int v) {
	if (dep[u] > dep[v])swap(u, v);
	int l = 21;
	while (dep[u] < dep[v]) {
//		cout << u << " " << v << "\n";
		l--;
		if (fa[v][l] == 0)continue;
		if (dep[fa[v][l]] >= dep[u])v = fa[v][l];
	}
//	cout << u << " " << v << "\n";
//	cout << dep[u] << " " << dep[v] << "\n";
	if (u == v)return u;
	for (int i = 20; i >= 0; i--) {
		if (fa[u][i] != fa[v][i]) {
			u = fa[u][i];
			v = fa[v][i];
		}
	}
	return fa[u][0];
}
void reqzh(int x) {
	for (auto i : e[x]) {
		if (i == fa[x][0])continue;
		reqzh(i);
		a[x] += a[i];
	}
}
int main() {
//	cin.tie(0);
//	ios::sync_with_stdio(0);
	cin >> n;
	for (int i = 1; i <= n; i++)cin >> s[i];
	for (int i = 1; i < n; i++) {
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dep[1] = 1;
	build(1);
//	cout << lca(1, 4);
	for (int i = 2; i <= n; i++) {
		int l = lca(s[i - 1], s[i]);
		if (l == s[i - 1]) {
			a[fa[s[i - 1]][0]]--;
			a[s[i]]++;
		} else if (l == s[i]) {
			a[fa[s[i]][0]]--;
			a[s[i - 1]]++;
		} else {
			a[s[i - 1]]++;
			a[s[i]]++;
			a[fa[l][0]] -= 2;
		}
//		for (int i = 1; i <= n; i++)cout << a[i] << " ";
//		cout << "\n";
	}
	reqzh(1);
	for (int i = 2; i <= n; i++)a[s[i]]--;
	a[s[n]]--;
	for (int i = 1; i <= n; i++)cout << a[i] << "\n";
	return 0;
}
2024/12/14 11:28
加载中...