链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
如果你厌倦了长文题意,可以参考下面的伪代码理解题意。
你有一个数组 fa[i]fa[i]fa[i] 表示结点 iii 的父亲结点编号,初始 fa[2]=fa[3]=1fa[2]=fa[3]=1fa[2]=fa[3]=1;另有一个数组 tp[i]tp[i]tp[i] 表示结点 iii 的属性(左孩子结点还是右孩子结点)。初始 tp[2]=′L′tp[2]=\tt{'L'}tp[2]=′L′,tp[3]=′R′tp[3]=\tt{'R'}tp[3]=′R′。
即初始的树如右图所示:

接下来给出一个操作序列 strstrstr,其中会包含三种字符 L, R, M\tt L,~R,~ML, R, M:
- L\tt LL 操作:对所有上一轮新生成的结点中(初始新生成的结点是 2,32,32,3)所有 tp[i]=′L′tp[i]=\tt{'L'}tp[i]=′L′(左孩子)的结点,生成两个孩子结点,一个左孩子一个右孩子。
- R\tt RR 操作:对所有上一轮新生成的结点中(初始新生成的结点是 2,32,32,3)所有 tp[i]=′R′tp[i]=\tt{'R'}tp[i]=′R′ (右孩子)的结点,生成两个孩子结点,一个左孩子一个右孩子。
- M\tt MM 操作:对所有上一轮新生成的结点中(初始新生成的结点是 2,32,32,3)所有的结点(不论属性),生成两个孩子结点,一个左孩子一个右孩子。
最终求执行完 kkk 次操作序列 strstrstr 后(可以理解成将序列 strstrstr 复制成原来的 kkk 倍并依次执行)树的直径长度(树上一条链包含最多的结点个数)是多少。
如果你厌倦了长文题意,可以参考下面的伪代码理解题意:

代码中 Tree_Diametre(fa)\rm Tree\_Diametre(fa)Tree_Diametre(fa) 表示利用 fa\rm fafa 数组求树的直径。
输入描述:
全文第一行输入一行一个正整数 T(1≤T≤105)T(1\le T\le10^5)T(1≤T≤105),表示数据组数。
接下来对每组数据,第一行输入两个正整数 n,k(1≤n≤105,∑n≤3×106,1≤k≤109)n,k(1\le n\le10^5,\sum n\le3\times10^6,1\le k\le10^9)n,k(1≤n≤105,∑n≤3×106,1≤k≤109),分别表示 strstrstr 的长度和操作次数。
第二行输入这个长度为 nnn 的操作序列 strstrstr,由 nnn 个仅可能为 L\tt LL、R\tt RR、M\tt MM 的大写英文字母组成。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
char str[n+1];
scanf("%s",str);
ll pos=(ll)k*n+1;
for(int i=0;str[i];i++)
{
if(str[i]=='M')
{
pos=i;
break;
}
}
ll len=(ll)k*n-pos+1;
ll ans=(ll)k*n+2;
ans=max(ans,len*2);
printf("%lld\n",ans+1);
}
}
该博客主要讨论了一种基于给定操作序列构建树结构的问题,并介绍了如何在执行多次操作后计算树的直径。初始树有两个节点,通过'L'、'R'、'M'操作不断生成新的子节点。博客提供了伪代码来解释问题,并给出了解决方案,用于找到经过kkk次操作后的树的最大路径长度(直径)。
1314

被折叠的 条评论
为什么被折叠?



