正在载入在线练习界面,本页内容可直接阅读…
AK CSP › NOIP 提高 2011 第一轮真题 › 第 36 题
NOIP 提高 2011 第一轮 第 36 题:完善程序(大整数开方)第 2 空
题目
2.(笛卡尔树)对于一个给定的两两不等的正整数序列,笛卡尔树是这样的一棵二叉树:首先,它是一个最小堆,即除了根结点,每个节点的权值都大于父节点的权值;其次,它的中序遍历恰好就是给定的序列。例如,对于序列 $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;
}本小题
②处应填( )
答案
j=i
题解
考点定位
本题(笛卡尔树第②空)考「最小值位置记录」,对应大纲 4.3.3 树结构(难度【3】)。
解题过程
②处在扫描找最小值时记录位置:
``cpp if (min > a[i]) { min = a[i]; j = i; } ``
答案:j=i。
易错提醒
① j 是根(区间最小值)的下标,供左右递归分割;② 严格大于保证取最左最小值(笛卡尔树唯一性)。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号