CF1676G White-Black Balanced Subtrees
CF1676G White-Black Balanced Subtrees
考察树的遍历。
题目翻译有一个没有翻译到,就是输入的第二行,输入的是 到 的根节点。
第三行是一个字符串,我们可以对 进行初始化了。
表示以 为根,其的子树下面有多少个黑色结点,多少个白色结点。
其中 即它的子节点为黑的和, 为子节点为白色的和,最后在回溯之中统计即可。
最后看每个 的黑色结点的数量是否等于白色结点即可。
注意多测清空。
#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;
}