求调 WA on #17#18#19#20
查看原帖
求调 WA on #17#18#19#20
936388
Suin_tryin楼主2025/8/3 17:56
#include<iostream>
#include<vector>
using namespace std;
int n, m, idx;
int lg[300010], fa[300010][20], dep[300010];
int w[300010], root[300010][2], ch[15000010][2], sum[15000010], ans[300010];
vector<int> g[300010];
void init(int u, int f) {
    fa[u][0] = f; dep[u] = dep[f] + 1;
    for(int i = 1; i <= lg[dep[u]]; i ++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
    for(auto v : g[u])
        if(v != f) init(v, u);
}
int querylca(int a, int b) {
    if(dep[a] < dep[b]) swap(a, b);
    while(dep[a] > dep[b]) a = fa[a][lg[dep[a] - dep[b]]];
    if(a == b) return a;
    for(int t = lg[dep[a]]; t; t --)
        if(fa[a][t] != fa[b][t]) a = fa[a][t], b = fa[b][t];
    return fa[a][0];
}
void insert(int &u, int l, int r, int x, int k) {
    if(!u) u = ++idx;
    sum[u] += k;
    if(l == r) return ;
    int mid = l + r >> 1;
    if(x <= mid) insert(ch[u][0], l, mid, x, k);
    else insert(ch[u][1], mid + 1, r, x, k);
}
int merge(int u, int v, int l, int r) {
    if(!u || !v) return u | v;
    if(l == r) {
        sum[u] += sum[v];
        return u;
    }
    int mid = l + r >> 1;
    ch[u][0] = merge(ch[u][0], ch[v][0], l, mid);
    ch[u][1] = merge(ch[u][1], ch[v][1], mid + 1, r);
    sum[u] = sum[ch[u][0]] + sum[ch[u][1]];
    return u;
}
int query(int u, int l, int r, int x) {
	if(!u) return 0;
    if(l == r) return sum[u];
    int mid = l + r >> 1;
    if(x <= mid) return query(ch[u][0], l, mid, x);
    else return query(ch[u][1], mid + 1, r, x);
}
void dfs(int u, int fa) {
    for(auto v : g[u]) {
        if(v == fa) continue;
        dfs(v, u);
        root[u][0] = merge(root[u][0], root[v][0], 1, n);
        root[u][1] = merge(root[u][1], root[v][1], -n, 2 * n);
    }
    if(dep[u] + w[u] <= n) ans[u] = query(root[u][0], 1, n, dep[u] + w[u]);
    ans[u] += query(root[u][1], -n, 2 * n, dep[u] - w[u]);
}
int main() {
	//freopen("P1600_17.in", "r", stdin);
	//freopen("P1600.ans", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for(int i = 1; i < n; i ++) {
        int u, v; cin >> u >> v;
        g[u].push_back(v); g[v].push_back(u);
    }
    for(int i = 2; i <= n; i ++) lg[i] = lg[i / 2] + 1;
    init(1, 0);
    for(int i = 1; i <= n; i ++) cin >> w[i];
    for(int i = 1; i <= m; i ++) {
        int s, t; cin >> s >> t;
        int lca = querylca(s, t);
        insert(root[s][0], 1, n, dep[s], 1);
        insert(root[lca][0], 1, n, dep[s], -1);
        insert(root[t][1], -n, 2 * n, 2 * dep[lca] - dep[s], 1);
        insert(root[fa[lca][0]][1], -n, 2 * n, 2 * dep[lca] - dep[s], -1);
    }
    dfs(1, 0);
    for(int i = 1; i <= n; i ++) cout << ans[i] << " ";
    return 0;
}
2025/8/3 17:56
加载中...