CF1676G

题目简化和分析:

求一颗子树的黑白两数是否相等。

我们设黑 \(1\),白 \(-1\),若某一棵子树的权值为 \(0\),说明此刻的黑白个数相等,贡献加一。

从根搜索,每次将值传递给父亲,判断父亲此时的权值。

Solution:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db;

const int N=4e3+50;
const int M=1e5+50;
const int Mod=1e9+7;

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

int t,n;
int ans;
int c[N],si[N];
vector<int>tree[N];

void dfs(int u,int p){
	si[u]=c[u];
	for(int v=0;v<(int)tree[u].size();++v){
		if(tree[u][v]==p) continue;
		dfs(tree[u][v],u);
		si[u]+=si[tree[u][v]];
	}
	if(si[u]==0) ans++;
}
int main()
{
	scanf("%d",&t);
	while(t--){
		ans=0;
		n=read();
		for(int i=2;i<=n;++i){
			int x;
			x=read();
			tree[x].push_back(i);
			tree[i].push_back(x);
		}
		string s;
		cin>>s;
		for(int i=0;i<n;++i){
			if(s[i]=='W') c[i+1]=-1; else c[i+1]=1;
		}
		dfs(1,0);
		printf("%d\n",ans);
		for(int i=1;i<=n;++i) tree[i].clear();
	}
	return 0;
}

posted @ 2022-08-10 21:38  RVG  阅读(38)  评论(0)    收藏  举报