社区讨论

3pts求调

P4116Qtree3参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mik8828f
此快照首次捕获于
2025/11/29 19:47
3 个月前
此快照最后确认于
2025/11/30 21:25
3 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using ai2 = array<int, 2>;
const int N = 1e5 + 10;
int n, q;
int h[N], e[N << 1], ne[N << 1], idx;
int dfn[N], tot, sz[N], son[N], dep[N], top[N], id[N], cnt, fa[N];
set<ai2> ens[N];
void add_edge(int u, int v) {
    e[idx] = v, ne[idx] = h[u], h[u] = idx ++;
}
void dfs1(int u, int fth, int d) {
    sz[u] = 1, dep[u] = d, fa[u] = fth;
    for(int i = h[u]; ~i; i = ne[i]) {
        int v = e[i];
        if(v != fth) {
            dfs1(v, u, d + 1);
            sz[u] += sz[v];
            if(sz[v] > sz[son[u]]) son[u] = v;
        }
    }
}
void dfs2(int u, int sign, int cnt) {
    dfn[u] = ++ tot, top[u] = sign, id[u] = cnt;
    if(son[u]) dfs2(son[u], sign, cnt);
    int k = 0;
    for(int i = h[u]; ~i; i = ne[i]) {
        int v = e[i];
        if(!dfn[v]) {
            k ++;
            dfs2(v, v, cnt + k);
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    memset(h, -1, sizeof h);
    cin >> n >> q;
    for(int i = 1, u, v; i < n; i ++) {
        cin >> u >> v;
        add_edge(u, v), add_edge(v, u);
    }
    dfs1(1, -1, 1);
    // return 0;
    dfs2(1, 1, 1);
    // for(int i = 1; i <= n; i ++) cerr << "i = " << i << " id[i] = " << id[i] << '\n';
    // cerr << '\n';
    for(int op, x; q --; ) {
        cin >> op >> x;
        int TMP = x;
        if(op == 0) {
            if(ens[id[x]].count(ai2{dep[x], x})) ens[id[x]].erase(ai2{dep[x], x});
            else ens[id[x]].insert(ai2{dep[x], x});
        } else {
            int ans = -1;
            while(top[x] != 1) {
                if(ens[id[x]].size()) {
                    if((*ens[id[x]].begin())[0] <= dep[x]) ans = (*ens[id[x]].begin())[1];
                }
                x = fa[top[x]];
            }
            if(ens[1].size()) {
                if((*ens[1].begin())[0] <= dep[x]) ans = (*ens[1].begin())[1];
            }
            cout << ans << '\n';
        }
    }
    return 0;
}
/*
9 4
1 2
1 3
2 4
2 9
5 9
7 9
8 9
6 8
1 3
0 8
1 6
1 7
*/

回复

0 条回复,欢迎继续交流。

正在加载回复...