#561. NOIP2011TG-28

NOIP2011TG-28

28.(完善程序)

(笛卡尔树)对于一个给定的两两不等的正整数序列,笛卡尔树是这样的一棵二叉树:首先,它是一个最小堆,即除了根结点,每个节点的权值都大于父节点的权值;其次,它的中序遍历恰好就是给定的序列。例如,对于序列 7、2、12、1、10、5、15、3,下图就是一棵对应的笛卡尔树。现输入序列的规模 n(1 ≤ n < 100)和序列的 n 个元素,试求其对应的笛卡尔树的深度 d(根节点深度为 1),以及有多少个叶子节点的深度为 d。

#include<iostream>
using namespace std;
const int SIZE=100+5;
const int INFINITY=1000000;
int n,a[SIZE],maxDeep,num;

void solve(int left,int right,int deep)
{
  int i,j,min;

  if(deep>maxDeep){
    maxDeep=deep;
    num=1;
  }
  else if(deep==maxDeep)
    ____________________;
  min= INFINITY;
  for(i=left;i<=right;i++)
    if(min>a[i]){
      min=a[i];
      ____________________;
    }
  if(left<j)
    ____________________;
  if(j<right)
    ____________________;
}

int main()
{
  int i;
  cin>>n;
  for(i=1;i<=n;i++)
    cin>>a[i];
  maxDeep=0;
  solve(1,n,1);
  cout<<maxDeep<<' '<<num<<endl;
  return 0;
}

①:{{ input(1) }}

②:{{ input(2) }}

③:{{ input(3) }}

④:{{ input(4) }}