欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > gesp(C++六级)(13)洛谷:P11375:[GESP202412 六级] 树上游走

gesp(C++六级)(13)洛谷:P11375:[GESP202412 六级] 树上游走

2025/2/6 8:14:47 来源:https://blog.csdn.net/weixin_66461496/article/details/145453051  浏览:    关键词:gesp(C++六级)(13)洛谷:P11375:[GESP202412 六级] 树上游走

gesp(C++六级)(13)洛谷:P11375:[GESP202412 六级] 树上游走

在这里插入图片描述

题目描述

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

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

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

小杨想知道移动 n n n 次后自己所处的节点编号。数据保证最后所处的节点编号不超过 1 0 12 10^{12} 1012

输入格式

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

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

输出格式

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

样例 #1

样例输入 #1

3 2
URR

样例输出 #1

7

提示

小杨的移动路线为 2 → 1 → 3 → 7 2 \to 1 \to 3 \to 7 2137

子任务编号数据点占比 n n n s s s
1 1 1 20 % 20\% 20% ≤ 10 \leq 10 10 ≤ 2 \leq 2 2
2 2 2 20 % 20\% 20% ≤ 50 \leq 50 50 ≤ 10 \leq 10 10
3 3 3 60 % 60\% 60% ≤ 1 0 6 \leq 10^6 106 ≤ 1 0 12 \leq 10^{12} 1012

对于全部数据,保证有 1 ≤ n ≤ 1 0 6 1\leq n\leq 10^6 1n106 1 ≤ s ≤ 1 0 12 1\leq s\leq 10^{12} 1s1012

AC代码(100分)

#include<bits/stdc++.h>
using namespace std;
/*思路:按题意模拟,需要特别注意这个点:题目只说最后所处的节点编号不超过10^12,没有说经过的节点编号不超过10^12,如果超过会爆long long解决方案:一旦编号超过10^12,就暂时不进行2和3移动,记下来等到进行1移动时抵消掉 
*/
const int INF=1e12;
long long n,s,cnt;//cnt用于统计中间过程中超过10^12的次数 
char c; 
int main(){cin>>n>>s;for(long long i=1;i<=n;i++){cin>>c;if(c=='U'){//移动到父节点 if(cnt!=0){cnt--;//抵消continue;//停止本次循环,继续下次循环 } if(s!=1) s=s/2; }else if(c=='L'){//移动到左儿子 if(s*2>INF) cnt++;else s=s*2;}else{//移动到右儿子 if(s*2>INF) cnt++;else s=s*2+1;}}cout<<s;return 0;
}

文末彩蛋:

点击王老师青少年编程主页有更多精彩内容

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com