正在载入在线练习界面,本页内容可直接阅读…

AK CSP › NOIP 提高 2011 第一轮真题 › 第 38 题

NOIP 提高 2011 第一轮 第 38 题:完善程序(大整数开方)第 4 空

完善程序 · 树与二叉树 · 答案 solve(j+1,right,deep+1)

题目

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

![](https://cdn.luogu.com.cn/upload/image_hosting/84hi4zrg.png)

#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;
}

本小题

④处应填( )

答案

solve(j+1,right,deep+1)

题解

考点定位

本题(笛卡尔树第④空)考「右子区间递归」,对应大纲 4.3.3 分治(难度【2】)。

解题过程

④处对根 j 右侧递归:

``cpp if (j < right) solve(j + 1, right, deep + 1); ``

答案:solve(j+1,right,deep+1)。

易错提醒

① 与③对称;② 主函数 solve(1,n,1) 从根深度 1 开始。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号