dp[i]:以第i个节点为根节点的子树的染色个数。 tree[i]:为第i个节点的父亲节点。 先获取树,然后为需要染色的节点赋值dp[i]=1,最后从第n个节点依次往前逐次把dp[i]增加到dp[tree[i]]上。

dp[tree[i]]+=dp[i];

#include<iostream>
using namespace std;

int main(){
    int n,q;
    int tree[101010]={0};
    int dp[101010]={0};
    char c;
    cin>>n;
    tree[0]=n;
    tree[1]=-1;
    for(int i=2;i<=n;++i){
        cin>>tree[i];
    }
    for(int i=1;i<=n;++i){
        cin>>c;
        if(c=='R'){
            dp[i]=1;
        }
    }
    for(int i=n;i>1;--i)
        dp[tree[i]]+=dp[i];
    cin>>q;
    while(q--){
        int i;
        cin>>i;
        cout<<dp[i]<<endl;
    }
    return 0;
}

时间复杂度:O(n+q) 空间复杂度:O(n)