专栏文章
题解:P7128 「RdOI R1」序列(sequence)
P7128题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqiquys
- 此快照首次捕获于
- 2025/12/04 05:28 3 个月前
- 此快照最后确认于
- 2025/12/04 05:28 3 个月前
思路
题目标签也没有给任何的提示,但只要你读题仔细就能发现 和 仿佛在那里见过,你没有想错,在一棵二叉树上,一个节点编号为 的节点的左孩子编号为 右孩子编号为 ,当然这是在有的情况下。如果不理解大家就来看个图。圆圈中写的是节点的编号。
这样的话,思路就有了。建立一个 数组记录一下
出现的位置,然后直接从后往前枚举 ,当 就在 号位时 就不需要动了,因为此时的 已经排好了,但如果没拍好,切记不要盲目交换,而是将 移动到第一个再交换。
这样的话,思路就有了。建立一个 数组记录一下
出现的位置,然后直接从后往前枚举 ,当 就在 号位时 就不需要动了,因为此时的 已经排好了,但如果没拍好,切记不要盲目交换,而是将 移动到第一个再交换。部分参考代码
C++ 部分参考代码,有注释。
CPPfor(int i=flag;i>=2;i--){
if(df[i]!=i){//x没有排好
while(df[i]>1){//所处的位置大于1
cout<<df[i]/2<<' '<<df[i]<<'\n';//交换i号位和i/2号位
swap(x[df[i]],x[df[i]/2]);//标记
swap(df[i],df[x[df[i]]]);
}
int high=0;//栈顶
for(int j=i;j>=2;j/=2){//压入栈
t[++high]=j;
t[++high]=1;
}
for(int j=high;j>=2;j--){
cout<<t[j]<<' '<<t[j-1]<<'\n';//交换
swap(x[t[j]],x[t[j-1]]);
swap(df[x[t[j]]],df[x[t[j-1]]]);
}
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...