【求条】咱也不到错哪了
查看原帖
【求条】咱也不到错哪了
453555
qW__Wp楼主2024/11/2 11:27

WA on #4,已经用题解代码拍了500+组了。

#include <bits/stdc++.h>
//#define int long long
#define INF 0x3fffffff
#define INFF 1e18
#define endl '\n'
#define lson id << 1
#define rson id << 1 | 1
#define LL long long
#define ULL unsigned long long

using namespace std;

const int N = 1e5 + 5;

int hd[N], cnt, sum[N], fa[N][30], dep[N], lg[N], U[N], V[N];

struct Edge {
	int to, nx;
} e[N << 1];

void add(int u, int v) {
	e[ ++ cnt] = {v, hd[u]}, hd[u] = cnt;
}

void dfs(int u, int fat) {
	fa[u][0] = fat;
//	//printf("u = %d, fat = %d\n", u, fat);
	for (int i = hd[u]; i; i = e[i].nx) {
		int v = e[i].to;
		if (v == fat) continue;
		dep[v] = dep[u] + 1;
		dfs(v, u);
	}
}

int lca(int x, int y) {
	if (dep[x] > dep[y]) swap(x, y);
	while (dep[x] < dep[y]) {
		y = fa[y][lg[dep[y] - dep[x]]];
	}
	if (x == y) return x;
	for (int i = lg[dep[y]]; i >= 0; i --) {
		if (fa[x][i] != fa[y][i]) {
			x = fa[x][i], y = fa[y][i];
		}
	}
	return fa[x][0];
}

void dfs2(int u, int fat) {
	for (int i = hd[u]; i; i = e[i].nx) {
		int v = e[i].to;
		if (v == fat) continue;
		dfs2(v, u);
		sum[u] += sum[v];
	}
}

signed main() {
//	freopen("data.txt", "r", stdin);
//	freopen("WA.txt", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int n; cin >> n;
	for (int i = 1; i < n; i ++) {
		cin >> U[i] >> V[i];
		add(U[i], V[i]), add(V[i], U[i]);
	}
	for (int i = 2; i <= n; i ++) lg[i] = lg[i >> 1] + 1;
	dfs(1, 0);
	for (int i = 1; i < 30; i ++) {
		for (int j = 1; j <= n; j ++) {
			fa[j][i] = fa[fa[j][i - 1]][i - 1];
		}
	}
	int q; cin >> q;
	while (q --) {
		int a, b; cin >> a >> b;
		sum[a] ++, sum[b] ++, sum[lca(a, b)] -= 2;
	}
	dfs2(1, 0);
	for (int i = 1; i < n; i ++) {
		int u = 0;
		if (dep[U[i]] > dep[V[i]]) u = U[i];
		else u = V[i];
		cout << sum[u] << ' ';
	}
	return 0;
}
2024/11/2 11:27
加载中...