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