题目
思路
较板子更简单,不过输出前序遍历而已。
注意这里的下标与元素反过来了
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[10000008][4],tot;
inline int read()
{
int f=0;
char c=getchar();
while (c<'0'||c>'9') c=getchar();
while (c>='0'&&c<='9') f=f*10+c-'0',c=getchar();
return f;
}
void dfs(int x)
{
if (x==0) return;
cout<<x<<' ';
if (a[x][2]) dfs(a[x][2]);
if (a[x][3]) dfs(a[x][3]);
return;
}
int main()
{
n=read();
for (int i=1;i<=n;i++) a[read()][0]=i;
for (int i=1;i<=n;i++)
{
int top=tot;
while (top&&a[a[top][1]][0]>a[i][0]) top--;
if (top) a[a[top][1]][3]=i;
if (top<tot) a[i][2]=a[top+1][1];
a[tot=++top][1]=i;
}
dfs(a[1][1]);
return 0;
}