站外题求助(玄关
  • 板块灌水区
  • 楼主Kano_zyc
  • 当前回复16
  • 已保存回复16
  • 发布时间2023/9/23 16:34
  • 上次更新2023/11/2 18:30:22
查看原帖
站外题求助(玄关
1076440
Kano_zyc楼主2023/9/23 16:34

题目:

问题描述

小YY在学习树论时,看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称为“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。

什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设 key[p] 表示结点 p 上的数值。对于其中的每个结点 p ,若其存在左孩子 lc ,则 key[p] > key[lc] ;若其存在右孩子 rc ,则 key[p] < key[rc] 。注意,本题中的二叉搜索树应满足对于所有结点,其左子树中的 key 小于当前结点的 key ,其右子树中的 key 大于当前结点的 key 。

小YY与他人讨论的内容则是,现在给定一棵二叉树,可以任意修改结点的数值。修改一个结点的数值算作一次修改,且这个结点不能再被修改。若要将其变成一棵二叉搜索树,且任意时刻结点的数值必须是整数(可以是负整数或0),所需的最少修改次数。

相信这一定难不倒你!请帮助小YY解决这个问题吧。

输入格式

从文件 binary.in 中读入数据。

  • 第一行一个正整数 n 表示二叉树结点数。结点从 1 到 n 进行编号。
  • 第二行 n 个正整数用空格分隔开,第 i 个数 ai 表示结点 i 的原始数值。
  • 此后 n-1 行,每行两个非负整数 fa 和 ch,第 i+2 行描述结点 i+1 的父亲编号 fa,以及父子关系 ch(ch=0 表示 i+1 为左儿子,ch=1 表示 i+1 为右儿子)。
  • 结点 1 一定是二叉树的根。

输出格式

输出到文件 binary.out 中。

  • 仅一行包含一个整数,表示最少的修改次数。

样例输入1

3
2 2 2
1 0
1 1

样例输出1

2

数据范围及约定

  • 对于 20% 的数据,n ≤ 10,ai ≤ 100。
  • 对于 40% 的数据,n ≤ 100,ai ≤ 200。
  • 对于 60% 的数据,n ≤ 2000。
  • 对于 100% 的数据,n ≤ 10^5,ai < 2^31。

代码:

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 2005;
int n, r, g;
long long a[MAXN];

bool check() {
   
  //不会写了
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> r >> g;
    for (int i = 1; i <= n; i++) cin >> a[i];

    long long l = 1, r ; 
    while (l <=r) {
        long long mid = (l + r) / 2;
        if (check(mid)) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }

    cout << l << endl;
    return 0;
}

2023/9/23 16:34
加载中...