返回首页 返回题库

树上游走

C++ 中等 GESP六级真题 #树#模拟#栈#位运算

题目描述

题面描述

小杨有一棵包含无穷节点的二叉树(即每个节点都有左儿子节点和右儿子节点;除根节点外,每个节点都有父节点),其中根节点的编号为 1,对于节点 ,其左儿子的编号为 ,右儿子的编号为 。

小杨会从节点 开始在二叉树上移动,每次移动为以下三种移动方式的任意一种:

  • 第1种移动方式:如果当前节点存在父亲节点,向上移动到当前节点的父亲节点,否则不移动;
  • 第2种移动方式:移动到当前节点的左儿子;
  • 第3种移动方式:移动到当前节点的右儿子。

小杨想知道移动 次后自己所处的节点编号。数据保证最后的所处的节点编号不超过 。

输入格式

第一行包含一个正整数 ,代表移动次数和初始节点编号。

第二行包含一个长度为 且仅包含大写字母 的字符串,代表每次移动的方式,其中 代表第1种移动方式, 代表第2种移动方式, 代表第3种移动方式。

输出格式

输出一个正整数,代表最后所处的节点编号。

样例1

输入:

3 2
URR

输出:

7

样例1解释

小杨的移动路线为 2-1-3-7。

数据范围

对于全部数据,保证有 。

时间限制

1.0 s

内存限制

512.0 MB

💡 查看提示(先自己想一想再看)
核心考察点:大数处理、位运算优化、栈的应用抵消操作。解题思路:由于n最大可达1e6,直接模拟不会超时,但需要注意节点编号可能很大,需用long long类型存储。向上移动U可以用右移一位实现,左移L用左移一位实现,右移R用左移一位加1实现。为了避免频繁操作大数,可以用栈存储后续的L/R操作,遇到U时优先抵消栈顶的移动操作,减少对大数的修改次数。易错点:节点编号超过普通整数范围,必须使用64位整数;根节点向上移动不生效;移动后节点编号超过1e12时需暂存操作,避免溢出。
⚙ 开始做这道题 0 人做过 · 0 收藏 · 2 浏览

讨论(0)