用好vector很重要,vector<vector<int>> G(100005);
描述
小红拿到了一棵有根树。根节点为1号节点。
所谓树,指没有回路的无向连通图。
现在小红想给一部分点染成红色。之后她有 q\q 次询问,每次询问某点的子树红色节点的个数。
输入描述:
第一行一个正整数 nn ,代表树的节点个数。
第二行有 n-1n−1 个正整数,分别表示第 22 个节点到第 nn 个节点每个节点的父亲。
接下来一个长度为 nn 的、由'W'或'R'字符组成的字符串。第 ii 个字符为'W'代表该字符没被染色,若字符为'R'代表该字符被染成了红色。
接下来一个正整数 qq ,代表小红的询问次数。
接下来的 qq 行,每行有一个正整数 xx ,代表一次询问。
输出描述:
对于每次询问,输出一个整数,代表节点xx的子树的红色节点个数。
示例1
输入:
5 1 2 1 4 WRWRR 3 3 4 5
复制输出:
0 2 1
复制说明:
#include <iostream>
#include<vector>
#include<string.h>
using namespace std;
// int father[100005][100];
char color[100005];
int dp[100005];
int idx[100005];
vector<vector<int>> G(100005);
//dp[i]节点i的子树红色节点个数
int dfs(int x)
{
idx[x]=1;
if(color[x]=='R')
{
dp[x]=dp[x]+1;
}
for(int i=0;i<G[x].size();i++)
{
int m=G[x][i];
int result;
if(idx[m]!=1)
{
result=dfs(m);
}
dp[x]+=result;
}
return dp[x];
}
int main() {
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
G[x].push_back(i);
}
scanf("%s",color+1);
dfs(1);
int q;
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int query;
scanf("%d",&query);
printf("%d\n",dp[query]);
}
return 0;
}