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

· · 题解

思路

题目标签也没有给任何的提示,但只要你读题仔细就能发现 2x2x+1 仿佛在那里见过,你没有想错,在一棵二叉树上,一个节点编号为 x 的节点的左孩子编号为 2x 右孩子编号为 2x+1,当然这是在有的情况下。如果不理解大家就来看个图。圆圈中写的是节点的编号。 这样的话,思路就有了。建立一个 vis 数组记录一下

## 部分参考代码 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]]]); } } } ```