社区讨论

AC on #11#12求条

P4092[HEOI2016/TJOI2016] 树参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhj1jchm
此快照首次捕获于
2025/11/03 19:12
4 个月前
此快照最后确认于
2025/11/03 19:12
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
const int N=1e5+5;
int n,m;
int dep[N],sz[N],hson[N],top[N];
struct node{
	int tag;
}t[N<<2];
void build(int p,int pl,int pr){
	t[p].tag=1;
	if(pl==pr){
		return;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
}
void change(int p,int pl,int pr,int d){
    if(dep[t[p].tag]>dep[d]) return;
	t[p].tag=d;
}
void down(int p,int pl,int pr){
	int mid=(pl+pr)>>1;
	change(ls(p),pl,mid,t[p].tag);
	change(rs(p),mid+1,pr,t[p].tag);
}
void upd(int l,int r,int p,int pl,int pr,int d){
	if(l<=pl&&pr<=r){
		change(p,pl,pr,d);
		return;
	}
	down(p,pl,pr);
	int mid=(pl+pr)>>1;
	if(l<=mid) upd(l,r,ls(p),pl,mid,d);
	if(r>mid) upd(l,r,rs(p),mid+1,pr,d);
}
int q(int l,int r,int p,int pl,int pr){
	if(l<=pl&&pr<=r) return t[p].tag;
	down(p,pl,pr);
	int mid=(pl+pr)>>1;
	if(l<=mid) return q(l,r,ls(p),pl,mid);
	if(r>mid) return q(l,r,rs(p),mid+1,pr);
}
vector <int> e[N];
int pr[N],id[N],ord;
void dfs1(int u,int fa){
	dep[u]=dep[fa]+1;
	pr[u]=fa;
	sz[u]=1;
	for(int v:e[u]){
		if(v==fa) continue;
		dfs1(v,u);
		sz[u]+=sz[v];
		if(!hson[u]||sz[hson[u]]<sz[v]) hson[u]=v;
	}
}
void dfs2(int u,int topu){
	id[u]=++ord;
	top[u]=topu;
	if(!hson[u]) return;
	dfs2(hson[u],topu);
	for(int v:e[u]){
		if(v==pr[u]||v==hson[u]) continue;
		dfs2(v,v);
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m;
	for(int i=2;i<=n;i++){
		int u,v;
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	while(m--){
		char op;int u;
		cin>>op>>u;
		if(op=='C'&&dep[u]>dep[q(id[u],id[u],1,1,n)]) upd(id[u],id[u]+sz[u]-1,1,1,n,u);
		else cout<<q(id[u],id[u],1,1,n)<<'\n';
	}
	return 0;
}

回复

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

正在加载回复...