社区讨论

WA 68分 求助

P4092[HEOI2016/TJOI2016] 树参与者 3已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhk6eumy
此快照首次捕获于
2025/11/04 14:16
4 个月前
此快照最后确认于
2025/11/04 14:16
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,q,x,y,fa[100005],son[100005],sz[100005],dep[100005],dfn[100005],rnk[100005],top[100005],last[100005],cnt,s[100005],tag[100005];
char op;
vector<int>v[100005];
void dfs(int x,int fat){
	sz[x]=1;
	son[x]=-1;
	for(int y:v[x]){
		if(y==fat)continue;
		fa[y]=x;
		dep[y]=dep[x]+1;
		dfs(y,x);
		sz[x]+=sz[y];
		if(son[x]==1||sz[son[x]]<sz[y])son[x]=y;
	}
}
void dfs2(int x,int mn){
	top[x]=mn;
	dfn[x]=++cnt;
	rnk[cnt]=x;
	if(son[x]==-1){
		last[x]=cnt;
		return;
	}
	dfs2(son[x],mn);
	for(int y:v[x])if(y!=son[x]&&y!=fa[x])
		dfs2(y,y);
	last[x]=cnt;
}
void pushdown(int l,int mid,int r,int c){
	if(!tag[c])return;
	s[c<<1]=dep[tag[c]]>dep[s[c<<1]]?tag[c]:s[c<<1];
	s[c<<1|1]=dep[tag[c]]>dep[s[c<<1|1]]?tag[c]:s[c<<1|1];
	tag[c<<1]=dep[tag[c]]>dep[tag[c<<1]]?tag[c]:tag[c<<1];
	tag[c<<1|1]=dep[tag[c]]>dep[tag[c<<1|1]]?tag[c]:tag[c<<1|1];
	tag[c]=0;
}
void pushup(int c){
	s[c]=dep[s[c<<1]]>dep[s[c<<1|1]]?s[c<<1]:s[c<<1|1];
}
void update(int l,int r,int x,int y,int d,int c){
	if(y<l||r<x)return;
	if(x<=l&&r<=y){
		s[c]=dep[d]>dep[s[c]]?d:s[c];
		tag[c]=dep[d]>dep[tag[c]]?d:tag[c];
		return;
	}
	int mid=l+r>>1;
	pushdown(l,mid,r,c);
	if(x<=mid)update(l,mid,x,y,d,c<<1);
	if(y>mid)update(mid+1,r,x,y,d,c<<1|1);
//	pushup(c);
}
int query(int l,int r,int x,int c){
	if(l==r)return s[c];
	int mid=l+r>>1;
	pushdown(l,mid,r,c);
	if(x<=mid)return query(l,mid,x,c<<1);
	else return query(mid+1,r,x,c<<1|1);
}
void init(){
	cin>>n>>q;
	for(int i=1;i<n;i++)cin>>x>>y,v[x].push_back(y),v[y].push_back(x);
	dep[1]=1;
	dfs(1,-1);
	dfs2(1,1);
	update(1,n,dfn[1],last[1],1,1);
}
void solve(){
	while(q--){
		cin>>op>>x;
		if(op=='C')update(1,n,dfn[x],last[x],x,1);
		else cout<<query(1,n,dfn[x],1)<<endl;
	}
}
int main(){
	init();
	solve();
	return 0;
}

回复

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

正在加载回复...