1 条题解
-
0
#include<bits/stdc++.h> using namespace std; #define pb push_back const int N=1e5+5; int vis[N],f[N],tag[N]; struct node{ int to,len,c; }; vector<int> e[N]; vector<node> vec[N]; void rebuild(int u){ for(int v:e[u]){ tag[v]|=tag[u]; if(!vis[v]) f[v]=(f[v]&&!tag[v])+max(0,f[u]-1); rebuild(v); } tag[u]=0,f[u]=min(f[u],1); if(vis[u]) vis[u]=0,vec[u].clear(); } void dfs2(int u){ f[u]=0,tag[u]=1; for(auto &p:vec[u]) p.c=p.len,dfs2(p.to); } void dfs1(int u){ ++f[u]; for(auto p:vec[u]) if(p.c<=f[u]-1) dfs1(p.to); } void dfs(int u,int len,int c,int lst){ if(u!=1&&vis[u]) vec[lst].pb({u,len,c}),len=c=0,lst=u; for(int v:e[u]) dfs(v,len+1,c+((f[v]==0)||vis[v]),lst); } int opt[N],a[N]; signed main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int n,q; cin>>n>>q; for(int i=2,x;i<=n;++i) cin>>x,e[x].pb(i); for(int i=1;i<=q;++i) cin>>opt[i]>>a[i]; int B=sqrt(q); for(int l=1;l<=q;l+=B){ int r=min(q,l+B-1); for(int i=l;i<=r;++i) vis[a[i]]=1; vis[1]=1,dfs(1,0,0,1); for(int i=l;i<=r;++i) if(opt[i]==1) dfs1(a[i]); else if(opt[i]==2) dfs2(a[i]); else cout<<(f[a[i]]?"black":"white")<<"\n"; rebuild(1); } }
- 1
信息
- ID
- 6925
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者