[蓝桥杯 2021 省 A] 左孩子右兄弟

news2025/1/11 14:31:33

一、问题描述

P8744 [蓝桥杯 2021 省 A] 左孩子右兄弟

二、问题简析

2.1 左孩子右兄弟

首先,我们要了解怎么通过“左孩子右兄弟”表示法将多叉树转化为二叉树:对于一棵多叉树,一个父节点有多个子节点,将第一个子节点作为父节点的左孩子,并与父节点相连;将剩余的子节点作为左孩子的右兄弟,并用边与左孩子相连(不是父节点);处理完所有子节点后,再按一样的规则处理其余父节点。

以该多叉树为例:
图1
处理子节点:
图2
1 为根节点“拉一下”二叉树:
图3
注意: 多叉树中根节点的子节点并不一定按图所示的顺序排列,更准确地说,是无序的,也就是说左孩子和右兄弟的选择是任意的

2.2 树状dp

d p i = dp_i= dpi= i i i 为根节点的二叉树的高度 A i . s i z e = A_i.size= Ai.size= 原多叉树中根节点 i i i 的子节点个数 j ∈ A i j \in A_i jAi根节点 i i i 的所有子节点
假设在原多叉树中,根节点 i i i 的子节点都是叶节点,即子节点没有子节点。结合上图,就是没有节点 6。显然,用“左孩子右兄弟”转化后, d p i dp_i dpi 仅取决于 i i i 的子节点的个数,即 d p i = A i . s i z e dp_i=A_i.size dpi=Ai.size
在上文的基础上,假设子节点不再是叶节点,即子节点有子节点。结合上图,就是考虑节点 6。从贪心的角度,为了使二叉树最高,肯定要尽可能“延长”树,即最高的子树放在最下面。本例中,就是把节点 2 放在最下面,因为以 2 为根节点的子树高度为 1 1 1,其余子树都为 0 0 0。贪心地处理后,最大高度就是根节点 i i i 的子节点个数 + 子树的最大高度

总结一下,

d p i = A i . s i z e + m a x ( d p j   ∣   j ∈ A i ) dp_i=A_i.size + max({dp_j~|~j\in A_i}) dpi=Ai.size+max(dpj  jAi)


三、AC代码

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int quickin(void)
{
	int ret = 0;
	bool flag = false;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-')    flag = true;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9' && ch != EOF)
	{
		ret = ret * 10 + ch - '0';
		ch = getchar();
	}
	if (flag)    ret = -ret;
	return ret;
}

const int MAX = 1e5 + 3;
int N, dp[MAX];
vector<int> A[MAX];

void dfs(int x)
{
	vector<int> B = A[x];
	for (int i = 0; i < B.size(); i++)
	{
		dfs(B[i]);
		dp[x] = max(dp[x], dp[B[i]]);
	}
	dp[x] += B.size();
}

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	N = quickin();
	for (int i = 2; i <= N; i++)
	{
		int a = quickin();
		A[a].push_back(i);
	}
	
	dfs(1);
	cout << dp[1] << endl;
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1524450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

警惕MKP勒索病毒,您需要知道的预防和恢复方法。

引言&#xff1a; 在网络世界中&#xff0c;.mkp勒索病毒是一股威胁不可小觑的黑暗势力。它以其毒辣的加密手段威胁着我们的数据安全。本文将深入介绍.mkp勒索病毒&#xff0c;揭示如何恢复被其加密的数据文件&#xff0c;并分享一些预防措施&#xff0c;助您在数字世界中安全…

Linux:网络相关概念的认识

文章目录 基本认知数据跨网络传输初识ip地址 端口号端口号的理解 本篇是基于前面对于网络的基本框架搭建&#xff0c;进而进行相关概念的进一步理解&#xff0c;为后续准备 基本认知 那么首先总结一下一些基本的相关结论性的信息 对于任何协议来说&#xff0c;它本身都应该拥…

Langchain-chatchat+ChatGlm3-6b部署

我的环境 台式机 内存&#xff1a;16GB 显卡&#xff1a;GTX1060-6G 1. 基础环境准备 1.1. 安装anaconda&#xff0c;创建环境python版本3.11 conda create -n chatglm3 python3.11 conda activate chatglm3 1.2. 搭建cuda环境 # 查看cuda版本&#xff0c;版本是CUDA V…

如何订阅Midjourney

Midjourney介绍 Midjourney作为目前AI绘画领域效果卓越且备受青睐的工具&#xff0c;对于新用户而言&#xff0c;可能无法享受到免费试用的机会。因此&#xff0c;为了持续利用这款软件进行绘画创作&#xff0c;用户需要购买会员资格并开通订阅服务。那么&#xff0c;关于midj…

Redis数据存储的细节

原文章地址 : 深入学习Redis&#xff08;1&#xff09;&#xff1a;Redis内存模型 - 编程迷思 - 博客园 (cnblogs.com) 1.概述 关于Redis数据存储的细节&#xff0c;涉及到内存分配器&#xff08;如jemalloc&#xff09;、简单动态字符串&#xff08;SDS&#xff09;、5种对象…

Python入门(三)

序列 序列是有顺序的数据集合。序列包含的一个数据被称为元素&#xff0c;序列可以由一个或多个元素组成&#xff0c;也是可以没有任何元素的空序列。 序列的类型 元组&#xff08;定值表&#xff09;&#xff1a;一旦建立&#xff0c;各个元素不可再更变&#xff0c;所以一…

建设IAM/IDM统一身份管理,实现系统之间的单点登录(SSO)

企业实施身份管理的现状&#xff1a; 1.身份存储分散&#xff0c;不能统一供应诸多应用系统&#xff0c;企业用户信息常常存在于多个系统&#xff0c;如HR系统有一套用户信息&#xff0c;OA系统也有一套用户信息&#xff0c;身份存储不集中&#xff0c;不能统一地为诸多应用系…

ChatGPT :确定性AI源自于确定性数据

ChatGPT 幻觉 大模型实际应用落地过程中&#xff0c;会遇到幻觉&#xff08;Hallucination&#xff09;问题。对于语言模型而言&#xff0c;当生成的文本语法正确流畅&#xff0c;但不遵循原文&#xff08;Faithfulness&#xff09;&#xff0c;或不符合事实&#xff08;Factua…

clickhouse学习笔记01(小滴课堂)

老王经历-数据库架构演变历史 你是否能分清OLTP和OLAP系统 急速掌握-数据库里面行存储和列式存储 新一代列式存储ClickHouse介绍和应用场景说明 Linux服务器容器化部署ClickHouse实战 记得要在安全组里配置开放端口号。 到这我们就安装完了。 简单使用&#xff1a; 创建你的第…

C语言基础练习——Day10

目录 选择题 编程题 不用加减乘除做加法 找到所有数组中消失的数字 选择题 1、求函数返回值&#xff0c;传入-1&#xff0c;则在64位机器上函数返回 int func(int x) {int count 0;while (x){count;x x&(x - 1);//与运算}return count; } A 死循环B 64C 32D 16 答案&…

C# 打开文件对话框(OpenFileDialog)

OpenFileDialog&#xff1a;可以打开指定后缀名的文件&#xff0c;既能单个打开文件也能批量打开文件 /// <summary>/// 批量打开文档/// 引用&#xff1a;System.Window.Fomrs.OpenFileDialog/// </summary>public void OpenFile(){OpenFileDialog dialog new Op…

【解读】保障软件供应链安全:SBOM推荐实践指南(含指南获取链接)

2023年11底&#xff0c;美国NSA&#xff08;National Security Agency&#xff09;、CISA&#xff08;Cybersecurity and Infrastructure Security Agency&#xff09;等多个政府机构部门组成的ESF&#xff08;Enduring Security Framework&#xff0c;持久安全框架&#xff09…

力扣L15--- 67.二进制求和(JAVA版)-2024年3月17日

1.题目描述 2.知识点 注1&#xff1a; 二进制用 %2 /2 3.思路和例子 采用竖位相加的方法 4.代码实现 class Solution {public String addBinary(String a, String b) {StringBuilder sbnew StringBuilder();int ia.length()-1;int jb.length()-1;int jinwei0;int digit1,d…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

C++初阶:类与对象(尾篇)

目录 1. 构造函数与初始化列表1.1 对象的创建与构造函数的初始化1.2 初始化列表及构造函数存在的意义1.3 explicit关键字与构造函数的类型转换 2. static成员变量与static成员函数2.1 static成员变量2.2 static成员函数 3. 日期类流插入操作符的重载与友元3.1 友元3.2 友元函数…

【OpenGL手册19】几何着色器

目录 一、说明 二、渲染管线的逻辑 三、几何着色器 四、使用几何着色器 五、造几个房子 六、几何着色器渲染爆破物体 一、说明 如果说用顶点和片段着色器干了什么&#xff0c;其实不多。加入几何着色器&#xff0c;能够加大渲染能力&#xff0c;简化数据结构&#xff0c;…

【Linux】对进程PCB的理解查看进程信息的方法

一、学习准备&#xff1a;对操作系统工作模式的理解 首先我们要清楚的是&#xff0c;操作系统是一个进行软硬件资源管理的软件。操作系统对下要管理好底层硬件。每一个硬件的生产产商都会给他们的产品提供对应的驱动程序&#xff0c;驱动程序是特定于某一硬件或系统设备的软件组…

参与者中心方案设计

参与者中心方案设计 ⼀、背景介绍 为适应客⼾多元化&#xff0c;随着业务发展&#xff0c;需要⽀持以平台为基础⽀持多租⼾企业⼊驻⽅式进⾏对外放。 1.1 需求来源 客⼾、产品 1.2 需求描述 ⽀持多租⼾ ⽀持客⼾⾃定义⻆⾊、菜单权限 ⽀持根据不同⻆⾊设置不同数据权限控…

备战蓝桥杯Day26 - 二叉搜索树查询和删除操作

一、查询 递归查询 寻找的值比根节点大&#xff0c;遍历右子树&#xff1b; 寻找的值比根节点小&#xff0c;遍历左子树。 def qurey(self, node, val):if not node: # 没有节点&#xff0c;返回空return Noneif node.data < val:return self.qurey(node.rchild, val)el…

Spring MVC 如何返回响应

上期我们讲请求的时候&#xff0c;每个方法返回的数据就是响应&#xff0c;我们也可以返回一个静态页面&#xff0c;设置响应的状态码&#xff0c;Header信息等。 1. 返回静态页面 我们先在项目的static文件夹下创建一个HTML文件作为我们返回的页面&#xff1a; <!DOCTYPE…