社区讨论
样例过全WA求条悬关
P4116Qtree3参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjtny64
- 此快照首次捕获于
- 2025/11/04 08:19 4 个月前
- 此快照最后确认于
- 2025/11/04 08:19 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
int n, q, cnt;
int dep[maxn], siz[maxn], fa[maxn], son[maxn];
int dfn[maxn], top[maxn], rak[maxn];
int sum[maxn << 2];
vector <int> e[maxn];
void dfs1(int u, int h){
dep[u] = h;
siz[u] = 1;
for(int i = 0; i < e[u].size(); i++){
int v = e[u][i];
if(v == fa[u]) continue;
fa[v] = u;
dfs1(v, h+1);
if(siz[v] > siz[son[u]]) son[u] = v;
siz[u] += siz[v];
}
}
void dfs2(int u, int t){
top[u] = t;
dfn[++cnt] = u;
rak[u] = cnt;
if(son[u] != 0){
dfs2(son[u], t);
for(int i = 0; i < e[u].size(); i++){
int v = e[u][i];
if(v == fa[u] || v == son[u]) continue;
dfs2(v, v);
}
}
}
inline int ls(int u){
return u * 2;
}
inline int rs(int u){
return u * 2 + 1;
}
inline void push_up(int u){
sum[u] = sum[ls(u)] + sum[rs(u)];
}
void build(int u, int l, int r){
if(l == r) return;
int mid = (l + r) / 2;
build(ls(u), l, mid);
build(rs(u), mid+1, r);
push_up(u);
}
void update(int u, int l, int r, int k){
if(l == k && r == k){
if(sum[u] == 1) sum[u] = 0;
else sum[u] = 1;
return;
}
int mid = (l + r) / 2;
if(mid >= k) update(ls(u), l, mid, k);
else update(rs(u), mid+1, r, k);
push_up(u);
}
int query(int u, int l, int r, int ql, int qr){
if(l == r)
return rak[l];
int mid = (l + r) / 2;
if(ql <= mid && sum[ls(u)] > 0)
return query(ls(u), l, mid, ql, qr);
if(mid < qr && sum[rs(u)] > 0)
return query(rs(u), mid+1, r, ql, qr);
return -1;
}
int main(){
scanf("%d%d", &n, &q);
for(int i = 1; i < n; i++){
int u, v;
scanf("%d%d", &u, &v);
e[u].push_back(v);
e[v].push_back(u);
}
dfs1(1, 1);
dfs2(1, 1);
while(q--){
int k, u;
scanf("%d%d", &k, &u);
if(k == 0){
update(1, 1, n, dfn[u]);
}
else{
int ans = -1;
while(u != 0){
int pos = query(1, 1, n, dfn[top[u]], dfn[u]);
if(pos != -1) ans = pos;
u = fa[top[u]];
}
printf("%d\n", ans);
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...