【蓝桥】数树数

news2025/1/24 2:17:47

一、题目

1、题目描述

给定一个层数为 n n n 的满二叉树,每个点编号规则如下:
在这里插入图片描述
具体来说,二叉树从上往下数第 p p p 层,从左往右编号分别为:1,2,3,4,…, 2p-1

给你一条从根节点开始的路径,想知道到达的节点编号是多少?

例如,路径是 r i g h t − l e f t right - left rightleft,那么到达的节点是 1 − 2 − 3 1-2-3 123,最后到了三号点,如下图所示:
在这里插入图片描述
输入格式:

第一行输入两个整数 n n n q q q n n n 表示完全二叉树的层数, q q q 代表询问的路径数量。

接下来 q q q 行,每行一个字符串 S S S S S S 只包含字符 { 'L','R'},L 代表向左,R 代表向右。

输出格式:
输出 q q q 行,每行输出一个整数,代表最后到达节点的编号。

样例输入

3 6
R
L
LL
LR
RL
RR

样例输出:

2
1
1
2
3
4

说明:
2 ≤ n ≤ 20 , 1 ≤ q ≤ 1 0 3 , 1 ≤ ∣ S ∣ < n 2 \le n \le 20, 1 \le q \le 10^3, 1 \le |S| \lt n 2n20,1q103,1S<n

完全二叉树: 一个二叉树,如果每层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为 k k k,且节点总数为 2 k − 1 2^{k-1} 2k1,则它就是满二叉树。

2、基础框架

#include <iostream>
using namespace std;

int main()
{   
	// 请在此输入您的代码
	return 0;
}

3、原题链接

数树数

二、解题报告

1、思路分析

解法1:暴力解

建立起一棵 n n n 个节点的完全二叉树,然后标号,暴力走路径。

时间复杂度 O ( 2 n + ∑ ∣ S ∣ ) O(2^n + \sum|S|) O(2n+S)

解法2:计算

利用满二叉树的性质,第 i i i 层的节点数量是 2 i − 1 2^{i-1} 2i1 个。

在一条路径上,实际上与 n n n 并无关系,只与最后到达的层数有关,所以只与路径的长度有关,维护当前点的编号 i d id id ,初始值为 1 1 1 ,如果路径长度是 p p p ,那么最后到达的层数就是 p p p ,当前所在的层数是 q q q ,那么当前节点的子树的叶节点总数就是 2 p − q 2^{p-q} 2pq

如果向左,则到达下一层,并且 i d id id 不变;如果向右,就是跨越了 2 p − q − 1 2^{p-q-1} 2pq1 个节点(当前节点的左树的节点全部排除), i d id id 加上 2 p − q − 1 2^{p-q-1} 2pq1

时间复杂度: O ( ∑ ∣ S ∣ ) O(\sum |S|) O(S)

2、代码详解

  • 暴力解
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;
const int N = 2e6 + 100;
const int MOD = 998244353;

int L[N], R[N], val[N];
int depVal[N];
int op = 1;

void build(int u, int dpt) {
    val[u] = ++depVal[dpt];
    if (dpt == 20) {
        return;
    }
    L[u] = ++op;
    build(L[u], dpt + 1);
    R[u] = ++op;
    build(R[u], dpt + 1);
}
char s[40];

void dfs(int u, char *c) {
    if (*c == '\0') {
        cout << val[u] << '\n';
        return;
    }
    if (*c == 'L') {
        dfs(L[u], c + 1);
    } else {
        dfs(R[u], c + 1);
    }
}

void sol() {
    build(1, 1);
    int n, q;
    cin >> n >> q;
    while (q--) {
        cin >> s;
        dfs(1, s);
    }
}

int main() {
    // ios::sync_with_stdio(0);
    // cin.tie(0);
    // cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T--) {
        sol();
    }
    exit(0);
}
  • 计算法
#include <iostream>
using namespace std;

int main()
{   
    int n;
    int q;
    cin >> n;
    cin >> q;

    string s;
    
    while (q--) {
        cin >> s;
        int len = s.size();
        int ans = 1;
        for (int i = 0; i < len; i++) {
            if (s[i] == 'R') {
                ans += (1 << (len - i - 1)); //左树上的节点跳过
            }   
        }
        cout << ans << endl;
    }
    return 0;
}

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

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

相关文章

Node.js初体验

Node.js简介 node.js的运行环境 1.V8引擎对js代码进行解析与执行 2.内置API&#xff1a;fs、path、http...等&#xff0c;提供了一些能力&#xff0c;能够使得js调用这些API去做一些后端的事情 流程&#xff1a;我们在node.js的运行环境中编写待执行的JavaScript代码&#…

Spring Cloud Gateway 使用 Redis 限流使用教程

从本文开始&#xff0c;笔者将总结 spring cloud 相关内容的教程 版本选择 为了适应 java8&#xff0c;笔者选择了下面的版本&#xff0c;后续会出 java17的以SpringBoot3.0.X为主的教程 SpringBoot 版本 2.6.5 SpringCloud 版本 2021.0.1 SpringCloudAlibaba 版本 2021.0.1.…

单目3D目标检测——MonoCon 模型训练 | 模型推理

本文分享 MonoCon 的模型训练、模型推理、可视化3D检测结果、以及可视化BEV效果。 模型原理&#xff0c;参考我这篇博客&#xff1a;【论文解读】单目3D目标检测 MonoCon&#xff08;AAAI2022&#xff09;_一颗小树x的博客-CSDN博客 源码地址&#xff1a;https://github.com/2…

在vs code中创建一个名为 “django_env“ 的虚拟环境报错?!以下或许方法可以解决

# vs code 终端窗口中运行&#xff1a; mkvirtualenv django_env # 拓展&#xff1a; mkvirtualenv django_env 是一个命令&#xff0c;用于创建一个名为 "django_env" 的虚拟环境。虚拟环境是一种用于隔离不同Python项目所需依赖的工具。通过创建虚拟环境&#x…

【分布式计算】九、容错性 Fault Tolerance

分布式系统应当有一定的容错性&#xff0c;发生故障时仍能运行 一些概念&#xff1a; 可用性Availability&#xff1a;系统是否准备好立即使用 可靠性Reliability&#xff1a;系统连续运行不发生故障 安全性&#xff1a;衡量安全故障的指标&#xff0c;没有严重事件发生 可维护…

zabbix内置宏、自动发现与注册

一、zabbix内置宏 1、概念&#xff1a; 在Zabbix中&#xff0c;内置宏是一种特殊的变量&#xff0c;通常用在 Trigger 名称和表达式中&#xff0c;引用有关监控对象的信息。 2、种类&#xff1a; {HOST.NAME} 主机名 {HOST.IP} 主机 IP 地址 {TRIGGER.DESCRIPTION} 触…

Unity中Shader的深度缓冲区

文章目录 前言一、什么是深度缓冲区深度缓冲区是和颜色缓冲区、模板缓冲区平行的一个缓冲区在这里插入图片描述 二、什么是深度信息三、深度缓冲区的作用 前言 Unity中的深度缓冲区 一、什么是深度缓冲区 深度缓冲区是和颜色缓冲区、模板缓冲区平行的一个缓冲区 深度缓冲区&a…

勒索软件组织声称它“损害了所有索尼系统”

新晋勒索软件组织 RansomedVC 声称已成功入侵娱乐巨头索尼的计算机系统。正如勒索软件团伙所做的那样&#xff0c;它在其暗网网站上发布了这一消息&#xff0c;并在那里出售从受害者计算机网络中窃取的数据。 该公告称索尼的数据正在出售&#xff1a; 索尼集团公司&#xff08…

数据结构与算法--并查集结构

数据结构与算法--并查集结构 1 岛问题 2 并查集结构 1 岛问题 一个矩阵中只有0和1两种值&#xff0c;每个位置都可以和自己的上、下、左、右 四个位置相连&#xff0c;如果有一片1连在一起&#xff0c;这个部分叫做一个岛&#xff0c;求一个矩阵中有多少个岛? 【举例】 001…

FutureTask的测试使用和方法执行分析

FutureTask类图如下 java.util.concurrent.FutureTask#run run方法执行逻辑如下 public void run() {if (state ! NEW ||!RUNNER.compareAndSet(this, null, Thread.currentThread()))return;try {Callable<V> c callable;if (c ! null && state NEW) {V res…

【软考】9.4 图的概念/存储/遍历/最小生成树/拓扑/查找

《图》 图的存储&#xff08;顶点和边&#xff09; 邻接矩阵&#xff1a;适合边数较多的图&#xff0c;不易造成浪费无向图&#xff1a;不分方向&#xff1b;对称矩阵 邻接链表&#xff1a;顶点&#xff0c;边——>&#xff08;编号&#xff0c;权值&#xff09;&#xff1b…

二维数组的行指针与列指针

二维数组的行指针与列指针 笔记来源&#xff1a;懒猫老师-C语言-用指针访问二维数组&#xff08;指针与二维数组&#xff09; 声明&#xff1a;本文笔记来自bili懒猫老师&#xff0c;仅供学习参考 回顾一维数组 int a[3];//其中a或a[0]是数组首地址 //a1指向第二个元素的地址…

The SDK location is inside Studio install location 解决

The SDK location is inside Studio install location 解决 安装 Android Studio SDK 时提示&#xff1a;The SDK location is inside Studio install location 解决 问题&#xff1a; 由于 SDK 与 编辑器(Android Studio)的安装在同一目录下所以报错。 解决 你需要在 Andro…

五、RocketMQ发送顺序消息

顺序消息的应用场景 在有序事件处理、撮合交易、数据实时增量同步等场景下&#xff0c;异构系统间需要维持强一致的状态同步&#xff0c;上游的事件变更需要按照顺序传递到下游进行处理。 例如需要保证一个订单的生成、付款和发货&#xff0c;这三件事情是被顺序执行的。 如…

C# OpenVINO Det 物体检测

效果 耗时 elephant:89% Preprocess: 0.00ms Infer: 47.21ms Postprocess: 11.63ms Total: 58.84ms 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using Sdcb.OpenVINO.Natives; using System; using System.Diagnostics; using System.Drawing; using System.Text; …

淘宝店铺订单详情接口,淘宝店铺订单列表数据,淘宝店铺订单物流接口,淘宝店铺订单线下发货接口-

淘宝店铺订单详情接口可以理解为淘宝开放平台&#xff08;Taobao Open Platform&#xff09;提供的API接口1。 该接口可以获取淘宝店铺的订单详情&#xff0c;包括订单号、买家昵称、收货人姓名、收货地址、邮编、电话、商品描述、价格等信息。开发者可以在淘宝开放平台注册一…

使用winUSB进行USB开发

什么是winUSB WinUSB是Windows操作系统提供的一种通用USB驱动程序&#xff0c;用于简化USB设备的开发和使用。它是一个用户模式驱动程序&#xff0c;可以在Windows XP及更高版本的操作系统上使用。WinUSB提供了一组API和工具&#xff0c;使开发人员能够与USB设备进行通信&…

C++11可变参数模板

文章目录 1.可变参数模板的介绍1.1C语言中的可变参数1.2C98/C11的类模板和函数模板1.3可变参数的函数模板1.4展开参数包递归展开初始化列表展开 2.可变参数模板的应用 1.可变参数模板的介绍 1.1C语言中的可变参数 1.2C98/C11的类模板和函数模板 C98/03&#xff0c;类模版和函…

Numpy(一)简介与基本使用

Numpy&#xff08;一&#xff09;简介与基本使用 一、Numpy简介 1.Numpy是一个运行速度非常快的数学库&#xff0c;主要用于数组计算 2.包含&#xff1a;N维数组对象ndarray、广播功能函数、整合C/C/Fortran代码工具、包含线性代数/傅里叶变换/随机数生成等功能 3.优点&…

ChatGPT快速入门

ChatGPT快速入门 一、什么是ChatGPT二、ChatGPT底层逻辑2.1 实现原理2.2 IO流程 三、ChatGPT应用场景3.1 知心好友3.2 文案助理3.3 创意助理3.4 角色扮演 一、什么是ChatGPT ChatGPT指的是基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的对话生成系…