样例第一行错了玄一关求条
查看原帖
样例第一行错了玄一关求条
1632009
pxn1234楼主2025/8/31 13:59

树剖求lca

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define pii pair<int,int>
constexpr int Mod = 998244353;
constexpr int N = 5e6 + 10;
constexpr int qwq = 1e5;
int rt[N];
int maxn[N], id[N];
int ls[N], rs[N];
int tot;
void pushup(int pos) {
    if(maxn[ls[pos]] > maxn[rs[pos]]) {
        maxn[pos] = maxn[ls[pos]];
        id[pos] = id[ls[pos]];
    } else if(maxn[ls[pos]] == maxn[rs[pos]]) {
        maxn[pos] = maxn[ls[pos]];
        id[pos] = max(id[ls[pos]], id[rs[pos]]);
    } else {
        maxn[pos] = maxn[rs[pos]];
        id[pos] = id[rs[pos]];
    }
}
void change(int &pos, int l, int r, int qpos, int k) {
    if(!pos) pos = ++tot;
    if(l == r) {
        maxn[pos] += k;
        id[pos] = l;
        return;
    }
    int mid = l + r >> 1;
    if(qpos <= mid) change(ls[pos], l, mid, qpos, k);
    if(mid < qpos) change(rs[pos], mid + 1, r, qpos, k);
    pushup(pos);
}
int merge(int u, int v, int l, int r) {
    if(!u || !v) return u + v;
    if(l == r) {
        maxn[u] += maxn[v];
//    printf("%d %d %d %d %d %d\n", u, l, r, val[u], maxn[u], id[u]);
//    printf("%d %d %d %d %d %d\n", v, l, r, val[v], maxn[v], id[v]);
        return u;
    }
    int mid = l + r >> 1;
    ls[u] = merge(ls[u], ls[v], l, mid);
    rs[u] = merge(rs[u], rs[v], mid + 1, r);
//    printf("%d %d %d %d %d %d\n", u, l, r, val[u], maxn[u], id[u]);
//    printf("%d %d %d %d %d %d\n", v, l, r, val[v], maxn[v], id[v]);
    pushup(u);
    return u;
}
vector<int>tr[N];
int depth[N], siz[N], fa[N], hson[N];
int top[N], dfn[N], dfc;
void dfs1(int x, int pre) {
    fa[x] = pre;
    siz[x] = 1;
    depth[x] = depth[pre] + 1;
    for(int y : tr[x]) {
        if(y == pre) continue;
        dfs1(y, x);
        siz[x] += siz[y];
        if(siz[hson[x]] < siz[y]) hson[x] = y;
    }
}
void dfs2(int x, int pre, int t) {
    top[x] = t;
    dfn[x] = ++dfc;
    if(hson[x]) dfs2(hson[x], x, t);
    for(int y : tr[x]) {
        if(y == pre || y == hson[x]) continue;
        dfs2(y, x, y);
    }
}
int lca(int x, int y) {
    while(top[x] != top[y]) {
        if(depth[top[x]] < depth[top[y]]) swap(x, y);
        x = fa[top[x]];
    }
    if(depth[x] < depth[y]) return x;
    else return y;
}
int ans[N];
void dfs(int x, int pre) {
    for(int y : tr[x]) {
        if(y == pre) continue;
        dfs(y, x);
//        printf("[%d %d]:\n",x,y);
        rt[x] = merge(rt[x], rt[y], 1, qwq);
    }
    ans[x] = id[rt[x]];
}
int n, m;
signed main() {
    cin >> n >> m;
    for(int i = 1; i < n; i++) {
        int x, y;
        cin >> x >> y;
        tr[x].push_back(y);
        tr[y].push_back(x);
    }
    dfs1(1, 0);
    dfs2(1, 0, 1);
    while(m--) {
        int x, y, k;
        cin >> x >> y >> k;
        change(rt[x], 1, qwq, k, 1);
        change(rt[y], 1, qwq, k, 1);
        change(rt[lca(x, y)], 1, qwq, k, -1);
        if(lca(x, y) != 1) change(rt[fa[lca(x, y)]], 1, qwq, k, -1);
    }
    dfs(1, 0);
    for(int i = 1; i <= n; i++) cout << ans[i] << '\n';
    return 0;
}

2025/8/31 13:59
加载中...