标题炒鸡吓人。
实质就是水题。
根据插入过程可以得到以下规律。
当前插入节点是极左的没有右儿子的节点。
大白话:向左儿子走只到没有右儿子为止。
记录答案,之后删除节点,交换所有父节点的左右儿子。
可以发现,这样是满足构造的。
但这为什么是最优解我不会证明QAQ
假装他是对的。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int a[105][2],fa[105],x,ans[105],n,rt;
void work(){
int cnt=n+1,p,f,son,fl;
while (cnt){
fl=0,p=rt;
while (a[p][1]!=-1) p=a[p][0];
son=a[p][0];
if (son!=-1&&a[son][0]==-1&&a[son][1]==-1) p=son;
ans[cnt--] = p;
f=fa[p],son=a[p][0];
if (p==rt) rt=son,fl=1,fa[son]=-1;
else if (son!=-1) a[f][0]=son,fa[son]=f;
else a[f][0]=-1;
while (p!=rt&&!fl){
p=fa[p];
swap(a[p][0],a[p][1]);
}
}
}
int main(){
scanf("%d",&n);
memset(a,-1,sizeof(a));
memset(fa,-1,sizeof(fa));
for (int i=1;i<=n;i++){
scanf("%d",&x);
if (x>=100) a[x-100][1]=i,fa[i]=x-100;
else a[x][0]=i,fa[i]=x;
}
rt=0;
work();
for (int i=1;i<=n+1;i++) printf("%d ",ans[i]);
}