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;
}