1 条题解

  • 0
    @ 2026-5-5 16:41:18
    #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
    上传者