【题目描述】

小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有
两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索
树和二叉堆。随后他又和他人讨论起了二叉搜索树。
      什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数值。
对于其中的每个结点p,若其存在左孩子lch,则key[p]>key[lch];若其存在右孩子rch,则
key[p]<key[rch];注意,本题中的二叉搜索树应满足对于所有结点,其左子树中的key小于
当前结点的key,其右子树中的key大于当前结点的key。
      小Y与他人讨论的内容则是,现在给定一棵二叉树,可以任意修改结点的数值。修改一
个结点的数值算作一次修改,且这个结点不能再被修改。若要将其变成一棵二叉搜索树,且
任意时刻结点的数值必须是整数(可以是负整数或0),所要的最少修改次数。
相信这一定难不倒你!请帮助小Y解决这个问题吧。

【输入格式】
      第一行一个正整数 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 一定是二叉树的根。

【输出格式】
      仅一行包含一个整数,表示最少的修改次数。

样例输入 样例输出
3
2 2 2
1 0
1 1
2

【数据范围】
20 % :n <= 10 , ai <= 100. 40 % :n <= 100 , ai <= 200
60 % :n <= 2000 . 100 % :n <= 10 ^ 5 , ai < 2 ^ 31

思路

一开始以为是TreeDP,但后来想了想不太彳亍,所以想到了二叉搜索树的性质——中序遍历是有序数列。然后自己写了几个样例就发现修改次数其实就是 数列长度 - 最长上升子序列长度。

然后喜闻乐见地挂了……原因是有些情况修改的时候会修改出小数……

所以要把这个数列映射成一个最长不递减序列……方法就是把{a1, a2, a3, ……}改为{a1 - 1, a2 - 2, a3 - 3, ……},然后求一遍最长不递减序列长度就可以了

 #include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; #define MAXN 100005 int n;
int val[MAXN], fa[MAXN], ch[MAXN][], _q, q[MAXN], dp[MAXN], ans = ; inline int read() {
int s = , f = ;
char ch = getchar(); while(ch < '' || ch > '') {
if(ch == '-')
f = -;
ch = getchar();
} while(ch >= '' && ch <= '') {
s = s * + ch - '';
ch = getchar();
} return s * f;
} void dfs(int u) {
if(!u)
return;
dfs(ch[u][]);
q[++_q] = val[u];
dfs(ch[u][]);
} int main() {
//freopen("binary.in", "r", stdin);
//freopen("binary.out", "w", stdout); n = read(); for(int i = ; i <= n; ++i)
val[i] = read(); for(int i = ; i < n; ++i) {
int f, c;
scanf("%d%d", &f, &c);
fa[i + ] = f;
ch[f][c] = i + ;
} dfs(); for(int i = ; i <= n; ++i)
q[i] -= i; dp[] = q[];
for(int i = ; i <= n; ++i) {
if(q[i] >= dp[ans]) {
ans++;
dp[ans] = q[i];
continue;
}
int tmp = upper_bound(dp + , dp + ans + , q[i]) - dp;
dp[tmp] = q[i];
} printf("%d\n", n - ans); //fclose(stdin);
//fclose(stdout); return ;
}

2018.10.30 NOIp模拟赛 T1 改造二叉树的更多相关文章

  1. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  2. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  3. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  4. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  5. 2018.10.03 NOIP+ 模拟赛 解题报告

    得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...

  6. 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)

    传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...

  7. 2018.10.30 NOIP模拟 字胡串(单调栈+容斥)

    传送门 对于每个点,用单调栈求出它左右第一个比他大的位置. 然后对每个点O(logai)O(log_{a_i})O(logai​​)求出第一个拥有跟它不同二进制位的位置. 然后容斥一下就行了. 代码

  8. 2018.10.30 NOIP模拟 排列树(树形dp+组合数学)

    传送门 考试的时候乱搞过了. 其实题目就是让你求拓扑排序方案数. 直接树形dpdpdp然后组合数转移一下就行了. 乱搞代码

  9. 【NOIP 模拟赛】改造二叉树 最长上升子序列

    biubiu~~~ 这道题我一眼就以为是线段树优化dp并且有了清晰的思路但是发现,我不会线段树区间平移,我以为只是我不会,然而根本就不行........ 正解是把序列排出来然后我们让他们减去他们的下标 ...

随机推荐

  1. JS精粹知识点和我的解释

    函数若是不return则默认返回undefined const value=()=>{ let a=3; } let value_test; console.log(value(),value_ ...

  2. Java中文编程开发,让Java编写更改复杂

    额?what? 在B站无意中看到一张图,无意间已发了自己的好奇,实际上我早就知道Java支持Unicode编码也就是可以使用中文命名规则,但是我们可以包装一下,玩一玩完全使用中文编码也未尝不可,但是经 ...

  3. js校验金额输入

    //验证非负实数,保留2位小数,不采取四舍五入,不能去掉无效零,obj是this //示例:<input type="text" onkeyup="IWS_Chec ...

  4. 自定义ClassLoader加载class文件

    package com.yd.wmsc.util; public class Test { public void say(){ System.out.println("Say Hello& ...

  5. 根据不同环境配置pom

    clean install clean package -P jt808_dev clean package -P tanway_test -X gps-parent <?xml version ...

  6. JVM基础知识1--JAVA内存区域与内存溢出异常

    1,运行时数据区域 根据JAVA虚拟机规范的规定:JAVA虚拟机所管理的内存将会包括以下几个运行时数据区域 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用 ...

  7. Nginx支持PHP的CI框架

    1.找到CI库的配置文件修改 $config['base_url']    = 'http://test.example.com'; $config['uri_protocol'] = 'PATH_I ...

  8. js小数点后保留几位方法:toFixed

    (0.22223343534).toFixed(2) 结果:0.22

  9. C 碎片一 计算机知识

    一.计算机知识 1, 计算机组成及工作原理 计算机是硬件和软件的结合体.硬件由主机箱和外部设备组成,主机主要包括CPU.内存.主板.硬盘.光驱.各种扩展卡.连接线.电源等:外部设备包括鼠标.键盘等.软 ...

  10. SpringMVC 返回自定义属性名

    SpringMVC 返回的属性名默认是小写驼峰形式的实体对象中的属性名,如 userID 属性名它会返回 userId. 如果接口方式之前已经定下来,这样前端按原来的方式取数据会读取失败的,那有没有方 ...