超题解失败,全TLE
查看原帖
超题解失败,全TLE
704668
WZWZWZWY楼主2024/7/11 08:26

超的这篇: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";
}
2024/7/11 08:26
加载中...