社区讨论

样例过全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 条回复,欢迎继续交流。

正在加载回复...