洛谷 3365 改造二叉树(中序遍历+LIS)

改造二叉树 一月20日 Description 什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设 key[p]key[p]key[p] 表示结点 ppp 上的数值。对于其中的每个结点p,若其存在左孩子 lchlchlch ,则 key[p]>key[lch]key[p]>key[lch]key[p]>key[lch] 若其存在右孩子 rchrchrch ,则 key[p]&... 阅读详情

前往原题
*考试题,看了很多题解后整理的。。。

题目背景

勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利。但是,小L对数据结构的掌握实在十分渣渣。

所以,小L当时卡在了二叉树。

题目描述

在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数值。对于其中的每个结点p,若其存在左孩子lch,则key[p]>key[lch];若其存在右孩子rch,则key[p] < key[rch];注意,本题中的二叉搜索树应满足对于所有结点,其左子树中的key小于当前结点的key,其右子树中的key大于当前结点的key。(因为小L十分喜欢装xx,所以这里他十分装xx的给大家介绍了什么是二叉树和二叉搜索树)。

可是善于思考的小L不甘于只学习这些基础的东西。他思考了这样一个问题:现在给定一棵二叉树,可以任意修改结点的数值。修改一个结点的数值算作一次修改,且这个结点不能再被修改。若要将其变成一棵二叉搜索树,且任意时刻结点的数值必须是整数(可以是负整数或0),所要的最少修改次数。

这一定难不倒聪明的你吧!如果你能帮小L解决这个问题,也许他会把最后的资产分给你1/16哦!

输入输出格式

输入格式:

第一行一个正整数n表示二叉树节点数。

第二行n个正整数用空格分隔开,第i个数ai表示结点i的原始数值。

此后n - 1行每行两个非负整数fa, ch,第i + 2行描述结点i + 1的父亲编号fa,以及父子关系ch,(ch = 0 表示i + 1为左儿子,ch = 1表示i + 1为右儿子)。

为了让你稍微减轻些负担,小L规定:结点1一定是二叉树的根哦!

输出格式:

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

输入输出样例

输入样例#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.

由“本题中的二叉搜索树应满足对于所有结点,其左子树中的key小于当前结点的key,其右子树中的key大于当前结点的key”可知,可以用二叉树的中序遍历,先左再根后右,处理处一个序列来,再求这个序列的LIS,也就是最长上升子序列。
注意一点,要注意1,2,1,3的情况,LIS求出结果为1,改为1,2,3,3,但其实答案为2,需改动1和3。这其实是求改为最长不下降子序列的操作数。只需令b[i]=a[i]-i,把原来要求的严格上升子序列转化为最长不下降子序列求LIS就可以了,避免了重复的情况。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int n,fa,ch,cnt,tot;
int f[100010],a[100010],d[100010],tree[100010][3];
void Done(int x)
{
    if(tree[x][0]) Done(tree[x][0]);
    d[++cnt]=a[x];
    if(tree[x][1]) Done(tree[x][1]);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
       scanf("%d",&a[i]);
    for(int i=2;i<=n;++i)
    {
        scanf("%d%d",&fa,&ch);
        tree[fa][ch]=i;
    }
    Done(1);
    for(int i=1;i<=cnt;++i)  d[i]-=i;
    for(int i=1;i<=cnt;++i) 
    {
        if(d[i]>=f[tot]) f[++tot]=d[i];
        else {
            int k=lower_bound(f+1,f+tot+1,d[i])-f;
            f[k]=d[i];
        }
    }
    printf("%d",n-tot);
    return 0;
}
模拟赛 改造二叉树(时间限制 1s;空间限制 256M) 题目描述 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。 什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数值。对于其中的每个结点p,若其存在左孩子lch,则key[p]>key[lch];若其存在右孩子rch, 阅读详情

相关推荐

最长上升子序列(LIS)洛谷

题目描述:   传送门 题解思路:和最长公共子序列一样,LIS也是一个经典的dp问题。动规的常见套路是将原问题化简成多个形式相同的子问题。这里求序列的最长上升子序列长度,首先求以ai(ai是序列中的元素,1<=i<=n)结尾的最长上升子序列长度,再从这些以ai结尾的最长子序列长度中选择一个最长的作为整个序列的最长上升子序列长度。 核心算法: 假设maxlen(i)表示以ai为终点的最长上升子序列长度,则有: 初始状态maxlen(1)=1(因为以a1为终点的上升序列就只有a1自己) maxlen

qq_44174803的博客 1085

洛谷月赛 U4727 小L 的二叉树

中序遍历+LIS

我要吃熊猫 660

BEVFormer详解

BEVFormer 是将Transformer架构的自注意机制与BEV视图中3D检测结合起来的一种纯视觉目标检测方案。对于纯视觉的BEV检测方案,其中的重中之重就是如何将2D的图像特征映射到3D空间的BEV栅格,既然是映射关系,那就有前行投影和反向查询两种机制。前向投影是基于深度估计的方法,参考基于深度估计的BEV视图转换方法,典型代表为LSS。反向查询方法思路为先将BEV栅格在Z方向上进行lift提升,然后再映射到图像特征图上进行特征查询。BEVFormer 就是基于这种机制进行2D图像特征到3D空间的B

MAX的专栏 4744

.net 数据结构与算法基础:二叉树

二叉树简介   在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;深度为k的二叉树至多有2

XIANG__jiangsu的专栏 1619

爬取微博热搜并分析情绪趋势:NLP + 可视化一体化实践

本文介绍了如何用Python构建微博热搜关键词爬取与情绪分析系统。通过requests库获取微博热搜数据,使用snownlp进行中文情绪分析(0-1评分),并借助pandas、matplotlib和seaborn实现数据可视化。文章提供了从环境配置、数据采集到情绪计算和趋势图绘制的完整代码示例,同时建议扩展思路包括评论分析、多维度情绪分类和舆情预警系统搭建。这套方法可以帮助快速洞察公众情绪变化,为舆情监测和市场研究提供数据支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 818

手把手教你用Simulink搭建BPSK调制解调系统(附完整参数设置与波形分析)

本文详细指导如何使用Simulink搭建BPSK调制解调系统,涵盖从理论到实践的全流程,包括参数设置、模块连接和波形分析。重点解析调制解调中的关键参数和常见问题,如带通滤波器设计、载波同步等,帮助读者快速掌握BPSK系统的实现与调试技巧。

weixin_27741699的博客 422

洛谷官方题单【数据结构1-2】二叉树

1.P4715 【深基16.例1】淘汰赛 解题思路:分上下半区选取亚军,则前半区最强的与后半区最强的相比较,弱的就是亚军 #include <iostream> using namespace std; int x[128]; int main(){ int n,sum=1; cin >> n; for(int i=0;i<n;i++){ sum*=2; } for(int i=0;i<sum;i++){ cin >> x[i]; } i

zihangjia的博客 711

【Creo】关于Creo一换网络就报错许可证丢失问题解决方案

依照我的个人理解,Creo只要一更换网络,则其许可证里面的网卡参数和现在的网络就对不上了,所以就会出现报错,并且有可能是报错代码(-9),提示许可证激活有问题。

weixin_52002180的博客 6036

【NOIP模拟题】【DP】【LIS】【中缀表达式】2016.11.15 第一题 小L的二叉树 题解

小L的二叉树【题目描述】 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利。但是,小L对数据结构的掌握实在十分渣渣。 所以,小L当时卡在了二叉树。 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数

It's Maverick. 541

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5916

分布式计算Ray框架面试题及参考答案

动态任务图执行引擎是一种能够根据任务之间的依赖关系和运行时的实际情况,动态构建和执行任务图的系统。在 Ray 中,动态任务图执行引擎允许任务在运行时根据数据可用性、计算资源状态等因素,灵活地决定后续任务的执行顺序和方式。对于 AI 应用来说,其往往具有动态性的特点。例如,在深度学习模型的训练过程中,可能需要根据训练的结果动态调整下一轮训练的参数、数据增强方式或者模型结构。动态任务图执行引擎可以很好地支持这些动态需求。它能够根据 AI 应用中各个任务的实时输出和依赖关系,动态地生成和调整任务图。

大模型大数据攻城狮的专栏 1350

洛谷 P3365 改造二叉树

中序遍历+lis

sdfzrlt的博客 796

软件设计师高频考点—套路题

学习交流的总结

秩沅 2539

【BST 中序 LIS】JZOJ_3894 洛谷_3365 改造二叉树

题意 给出一棵二叉树,它每个节点上的权值都是整数,我们可以把一个节点上的值任意修改,算作一次修改。求出把这棵二叉树变成BSTBSTBST的最少修改次数。 思路 根据题目的性质,BSTBSTBST的左孩子&amp;amp;lt;&amp;amp;lt;&amp;lt;根&amp;amp;lt;&amp;amp;lt;&amp;lt;右孩子,能容易发现它的中序遍历应该是一个严格递增的序列。 我们求出给出的二叉树的中序遍历,考虑如何修改最少的点使得这...

GOODPLACE 318

《中国电信运营商骨干网:历史、现状与未来演进》系列 第一篇:中国骨干网全景图:一级运营商与专用网络的演进

揭秘国家信息高速公路!一文读懂什么是骨干网,它如何支撑我们的数字生活,以及电信、联通、移动、广电等巨头如何构建这张“国家级动脉”。

maqh_csdn的博客 2036

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[jzoj 2894][洛谷3365] 改造二叉树{最长不下降序列(n log n)+dfs+二分}

题目 https://www.luogu.org/problemnew/show/P3365 解题思路 因为近几天做了一道平衡树的题目,二叉查找树是满足中序遍历(BST性质),严格满足递增。 所以想到了LIS(最长上升序列),(即n-LIS是最少修改的值),但是因为题目中修改的必须是整数。 所以无法这样做,我们可以将这样的序列映射成另一个序列: a[1]−1,a[2]−2,a[3]−3........

Nowed 462

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

开学第六测

          开学第六测   又一次考试... 成绩出来后心情无比的down   为什么??因为爆零了 2333   每次考完试都会发题解 但是被点名必须要写之后,就不是很想写了   接下来是正题:   T1 期望得分:20??     (本题相当于 洛谷 P3365) 【题目描述】   小Y在学树论时看到了有关二叉树的介绍:在计算机科...

weixin_30701521的博客 141

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[noip模拟]改造二叉树<LIS>

1.改造二叉树 【题目描述】 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。 什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数值。对于其中的每个结点p,若其存在左孩子lch,则key[p]>k...

baixunjiu2536的博客 264

【NOIP2014模拟10.26】改造二叉树

Description 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。 什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数值。对于其中的每个结点p,若其存在左孩子lch,则key[p]&gt;key[lch];若其...

Com_man_der的博客 384

二叉树

二叉树       在计算机科学中,二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。       二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树属于有序树,所以二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2i − 1个结点;深度为k的

迷途小书童 2074

【洛谷二叉树】

二叉树

weixin_62528401的博客 1805

洛谷——【数据结构1-2】二叉树

能力值高的国家和能力值低的国家踢比赛时高者获胜。晋级后的国家用相同的方法继续完成赛程,直到决出冠军。你的任务是在被给予奶牛家谱的“树中序遍历”和“树前序遍历”的符号后,创建奶牛家谱的“树的 后序遍历”的符号。每一头奶牛的姓名被译为一个唯一的字母。他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形的方法。第一行一个字符串,表示该树的中序遍历。第二行一个字符串,表示该树的前序遍历。仅一个整数,表示亚军国家的编号。单独的一行表示该树的后序遍历。

2301_77012063的博客 1447

[1.25] T1-改造二叉树

题目大意 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。 什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数值。对于其中的每个结点p,若其存在左孩子lch,则key[p]&gt;key[lch];若其存在右孩子rch,则key[p]&lt;key[rch]; 注意,本题中的二叉搜索树应满...

AAA_Ljw 211

LeetCode二叉树问题全解析(中)

一、二叉树的修改与改造问题 1、翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 这道题目大家第一次做可能会觉得它很简单,左换右,一直递归不就行了 但如果沉下心来思考这道问题的本质 我相信大家一定有所收获! 之前我们介绍了各种遍历二叉树的方式,如果要翻转这颗二叉树 我们应该采取哪一种遍历方式呢? 其实这道题采用前,中,后都可以 只要在遍历时交换左右节点即可 但是中序的时候有些麻烦 因为 我们左子树的节点已经完成了翻转而此时左右交换,中序遍历恰好需要到右子树.

qq_59539549的博客 2195
上一篇: poj 1061 青蛙的约会
下一篇: codevs 1021 玛丽卡
Loi_Mapleleaf
博客等级 码龄10年 17粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值