【题目描述】

小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. element input搜索框探索

    转(https://blog.csdn.net/qq_37746973/article/details/78402812) 在script中添加下面两个函数 //queryString 为在框中输入的 ...

  2. ACM 大神的经验加技巧(当然不是我的拉——

    大神 犯错合集及需要注意的东西 1.在一个地图求最大面积的类问题中,要注意障碍结点的影响. 2.ll(),表示的是在运算后把括号内强制转化为类型ll,而(ll)表示后面的每个玩意都强制转化为类型ll. ...

  3. 有效使用Mock编写java单元测试

    Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构.然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编 ...

  4. GHOST来进行备份和还原及菜单介绍

    这篇文章主要说的是如何手工操作GHOST来进行备份和还原. GHOST的菜单及功能: 在主菜单中,有以下几项: l Local:本地操作,对本地计算机上的硬盘进行操作. l Peer to peer: ...

  5. Word中图片自动编号且与文中引用的编号对应

    当我们在进行大篇幅 word 文档的编写时, 为了节约修改文章中图片所花费的大量时间, 可以将图片自动编号,且让文中引用的顺序跟着图片顺序的变化而变化,具体操作如下: 1. 将鼠标定在欲加编号的下方, ...

  6. 切换本地凭据(Windows上登录的GitHub账号)

    切换本地用户,可以向微软小娜搜索Windows凭据,这个步骤可以参考这篇博客 的说明.

  7. java对象在内存中的分配

    java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899

  8. lecture-9-hashmap

    1.hashmap基本操作 2.hash function,equals函数,hashCode 3.练习题 1)Two Sum Given an array of integers, return i ...

  9. SpringBoot | 第八章:统一异常、数据校验处理

    前言 在web应用中,请求处理时,出现异常是非常常见的.所以当应用出现各类异常时,进行异常的捕获或者二次处理(比如sql异常正常是不能外抛)是非常必要的,比如在开发对外api服务时,约定了响应的参数格 ...

  10. 【Android车载系统 News | Tech 5】车载设计开发

    1. 基于Android的车载移动终端系统的研究与开发 http://wenku.baidu.com/link?url=hIKlQ2myEmR8N0CA28a_SLzLA2Q9R5Xpk20OJ53h ...