题解 | #小红的树#

小红的树

http://www.nowcoder.com/practice/66ab364d3fba487eb39bd3460fd484c0

描述

给一棵根为11的树,树上部分节点被染色,qq次询问,每次询问某个节点的子树中有多少被染色的结点

思路

  • 树形DP模板题,设dp[i]dp[i]为节点ii为根的子树有多少节点被染色,初始化时,如果节点ii被染色,则dp[i]=1dp[i]=1否则为00
  • 转移方程为 dp[i]=dp[i]+jidp[j]dp[i]=dp[i]+\sum_{j是i的儿子}dp[j]

代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
char s[MAXN];
vector<int> E[MAXN];
int dp[MAXN];
void dfs(int now)
{
    if(s[now]=='R')
        dp[now]++;
    for(int v:E[now])
    {
        dfs(v);
        dp[now]+=dp[v];
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=2;i<=n;i++)
    {
        int fa;
        scanf("%d",&fa);
        E[fa].push_back(i);
    }
    scanf("%s",s+1);
    dfs(1);
    int q;
    scanf("%d",&q);
    while(q--)
    {
        int x;
        scanf("%d",&x);
        printf("%d\n",dp[x]);
    }
}

时间复杂度O(n)O(n),空间复杂度O(n)O(n)

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务