CF1676G White-Black Balanced Subtrees

CF1676G White-Black Balanced Subtrees

dpi,j\mathit{dp}_{i,j} 考察树的遍历。

题目翻译有一个没有翻译到,就是输入的第二行,输入的是 i+1i+1nn 的根节点。

第三行是一个字符串,我们可以对 sizisiz_{i} 进行初始化了。

siz[i]siz[i] 表示以 ii 为根,其的子树下面有多少个黑色结点,多少个白色结点。

其中 sizi,black\mathit {siz}_{i,black} 即它的子节点为黑的和,sizi,white\mathit {siz}_{i,white} 为子节点为白色的和,最后在回溯之中统计即可。

最后看每个 ii 的黑色结点的数量是否等于白色结点即可。

注意多测清空。

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
vector<int> g[N<<1];
struct node
{
	int black=0,white=0;
}siz[N];
int ans;
void dfs(int u,int fath)
{
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==fath)
			continue;
		dfs(v,u);
		siz[u].black+=siz[v].black,siz[u].white+=siz[v].white; 
	}
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		ans=0;
		cin>>n;
		for(int i=2,u;i<=n;i++)
			cin>>u,g[u].push_back(i);
		for(int i=1;i<=n;i++)
		{
			char k;
			cin>>k;
			if(k=='W')
				siz[i].white=1;
			else
				siz[i].black=1; 
		}
		dfs(1,0);
		for(int i=1;i<=n;i++)
			if(siz[i].black==siz[i].white)
				ans++; 
		cout<<ans<<endl;
		for(int i=1;i<=n;i++)
			g[i].clear(),siz[i].black=siz[i].white=0;
	}
	return 0;
}
posted @   June_Failure  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示