专栏文章

题解:P7128 「RdOI R1」序列(sequence)

P7128题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqiquys
此快照首次捕获于
2025/12/04 05:28
3 个月前
此快照最后确认于
2025/12/04 05:28
3 个月前
查看原文

思路

题目标签也没有给任何的提示,但只要你读题仔细就能发现 2x2x2x+12x+1 仿佛在那里见过,你没有想错,在一棵二叉树上,一个节点编号为 xx 的节点的左孩子编号为 2x2x 右孩子编号为 2x+12x+1,当然这是在有的情况下。如果不理解大家就来看个图。圆圈中写的是节点的编号。 这样的话,思路就有了。建立一个 visvis 数组记录一下 xx 出现的位置,然后直接从后往前枚举 xx,当 xx 就在 xx 号位时 xx 就不需要动了,因为此时的 xx 已经排好了,但如果没拍好,切记不要盲目交换,而是将 xx 移动到第一个再交换。

部分参考代码

C++ 部分参考代码,有注释。
CPP
for(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 条评论,欢迎与作者交流。

正在加载评论...