RGB树-美团2023笔试(codefun2000)

题目链接
RGB树-美团2023笔试(codefun2000)

题目内容

塔子哥是一位著名的冒险家,他经常在各种森林里探险。今天,他来到了道成林,这是一片美丽而神秘的森林。在探险途中,他遇到了一棵 n 个节点的树,树上每个节点都被涂上了红、绿、蓝三种颜色之一。塔子哥发现,如果这棵树同时存在一个红色节点、一个绿色节点和一个蓝色节点,那么我们就称这棵树是多彩的。很幸运,他发现这棵树最初就是多彩的。但是,在探险的过程中,塔子哥发现这棵树上有一条边非常重要,如果砍掉这条边,就可以把这棵树分成两个部分。他想知道,有多少种砍法可以砍掉这条边,使得砍完之后形成的两棵树都是多彩的。

输入描述

第一行个整数 n ,表示节点个数
第二行n−1 个整数 𝑝2,𝑝3,…,𝑝𝑛,pi表示树上 i 和 𝑝 两点之间有一条边。保证给出的定是一棵树。
第三行一个长度为 n 的字符串,第 i 个字符表示第 i 个节点的初始颜色。其中 R 表示红色, G 表示绿色, B 表示蓝色。
保证字符串只由这三种大写字母构成对于全部数据, 3 ≤ n ≤ 1 0 5 3≤n≤10^5 3n105

输出描述

输出一行,一个正整数,表示答案。

样例1

输入

7
1 2 3 1 5 5
GBGRRBB

输出

1

题解1

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

int n, ans;
struct Node{
	int Rcnt,Gcnt,Bcnt;
}node[N];
char s[N];
vector<int> edge[N];

void dfs1(int u){ // 统计以u为根节点的颜色为RGB的节点个数
	int sz = edge[u].size();
	if(sz == 0) return ;
	for(int i = 0; i < sz; i++){
		int v = edge[u][i];
		dfs1(v);
		node[u].Rcnt += node[v].Rcnt;
		node[u].Gcnt += node[v].Gcnt;
		node[u].Bcnt += node[v].Bcnt;
	}
}
void dfs2(int u){
	int sz = edge[u].size();
	for(int i = 0; i < sz; i++){ // 遍历每条边,以每条边为边界,分成两部分,判断两部分的RGB颜色节点个数是否>=1 
		int v = edge[u][i];
		
		int rcnt = node[v].Rcnt;
		int gcnt = node[v].Gcnt;
		int bcnt = node[v].Bcnt;
		int Rcnt = node[1].Rcnt - rcnt;
		int Gcnt = node[1].Gcnt - gcnt;
		int Bcnt = node[1].Bcnt - bcnt;
		if(rcnt >= 1 && gcnt >= 1 && bcnt >= 1 && Rcnt >= 1 && Gcnt >= 1 && Bcnt >= 1) {
			ans++;
			dfs2(v);
		}
	}
} 
int main(){
	scanf("%d", &n);
	for(int i = 2, u; i <= n; i++){
		scanf("%d", &u);
		edge[u].push_back(i);
	}
	scanf("%s", s + 1);
	for(int i = 1; s[i] != '\0'; i++){
		if(s[i] == 'G') node[i].Gcnt++;
		else if(s[i] == 'R') node[i].Rcnt++;
		else if(s[i] == 'B') node[i].Bcnt++;
	}
	dfs1(1);
	dfs2(1);
	printf("%d\n", ans); 
	return 0;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值