树上差分,样例过了全TLE,求助!!!
查看原帖
树上差分,样例过了全TLE,求助!!!
1120049
LiYAOo楼主2024/6/25 18:46
#include <bits/stdc++.h>
using namespace std;
#define maxn 300520
int n;
int a[maxn], b[maxn], d[maxn], fa[maxn][25];
vector <int>edges[maxn];

void dfs(int u, int f) {
	d[u] = d[f] + 1;
	fa[u][0] = f;
	for (int i = 0; fa[u][i] != 0; i++) {
		fa[u][i + 1] = fa[fa[u][i]][i];
	}
	for (int v : edges[u]) {
		if (v == f) continue;
		dfs(v, u);
	}
}

int lca(int u, int v) {
	if (d[u] < d[v]) swap(u, v);
	for (int i = 19; i >= 0; i--) {
		if (d[fa[u][i]] >= d[v]) {
			u = fa[u][i];
		}
	}
	if (u == v) return v;
	for (int i = 19; i >= 0; i--) {
		if (fa[u][i] != fa[v][i]) {
			u = fa[u][i];
			v = fa[v][i];
		}
	}
}

void sum(int u, int f) {
	for (int v : edges[u]) {
		if (v == f) continue;
		sum(v, u);
		b[u] += b[v];
	}
}

int main () {
	ios::sync_with_stdio(false);
	cin.tie(0);
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	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;
		edges[x].push_back(y);
		edges[y].push_back(x);
	}
	dfs(1, 0);
	for (int i = 1; i < n; i++) {
		int u = a[i], v = a[i + 1];
		int l = lca(u, v);
		b[u]++, b[v]++;
		b[l]--, b[fa[l][0]]--;
	}
	sum(1, 0);
	for (int i = 2; i <= n; i++) {
		b[a[i]]--;
	}
	for (int i = 1; i <= n; i++) {
		cout << b[i] << '\n';
	}
	return 0;
}
2024/6/25 18:46
加载中...