1167 Cartesian Tree (30 分)
题意:给一组数,求生成的笛卡尔树的层级遍历
笛卡尔树(Cartesian tree):
每次选取当前区间[l,r]中val的最小值所在的pos作为子树的根节点
然后对于[l,i−1],[i+1,r]递归地不断重复上述过程
写的递归,访问到每一个点的时候递归了几层记录下来,(也算一个标志区分不同的区间),根据这个层数输出结果(数据量小无所畏惧直接n^2)
#include<bits/stdc++.h>
using namespace std;
int a[50][3]={0};
int n,minn,mini,maxx=0;
void fs(int i,int cs){
a[i][1]=cs+1;
if((i==0||a[i-1][1]!=0)&&(i==n-1||a[i+1][1]!=0)){
return ;
}else if(i==n-1||a[i+1][1]!=0){///1
int x=i-1,mn=maxx,mi;
while(x!=-1&&a[x][1]==0){
if(a[x][0]<=mn){
mn=a[x][0];
mi=x;
}
x--;
}
fs(mi,cs+1);
}else if(i==0||a[i-1][1]!=0){///2
int x=i+1,mn=maxx,mi;
while(x!=n&&a[x][1]==0){
if(a[x][0]<=mn){
mn=a[x][0];
mi=x;
}
x++;
}
fs(mi,cs+1);
}else{///3
int x=i+1,mn=maxx,mi;
while(x!=n&&a[x][1]==0){
if(a[x][0]<=mn){
mn=a[x][0];
mi=x;
}
x++;
}
fs(mi,cs+1);
x=i-1;
mn=maxx;
while(x!=-1&&a[x][1]==0){
if(a[x][0]<=mn){
mn=a[x][0];
mi=x;
}
x--;
}
fs(mi,cs+1);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i][0];
if(i==0){
minn=a[i][0];
mini=0;
}else{
if(minn>a[i][0]){
minn=a[i][0];
mini=i;
}
}
maxx=max(a[i][0],maxx);
}
fs(mini,0);
maxx=-1;
for(int i=0;i<n;i++){
maxx=max(maxx,a[i][1]);
}
int cnt=0;
queue<int> q;
for(int i=1;i<=maxx;i++){
for(int j=0;j<n;j++){
if(a[j][1]==i){
q.push(a[j][0]);
}
}
}
int flag=0;
while(!q.empty()){
if(flag==0){
flag=1;
cout<<q.front();
}else{
cout<<" "<<q.front();
}
q.pop();
}
return 0;
}