社区讨论
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 条回复,欢迎继续交流。
正在加载回复...