【NOIP2014模拟10.30】二叉查找树(顺便记录一下迭代器)

南京邮电大学《数学实验》模块二(函数的迭代)参考答案 【代码】南京邮电大学《数学实验》模块二(函数的迭代)参考答案。 阅读详情

【NOIP2014模拟10.30】二叉查找树

Description

二叉查找树是二叉树,每个结点最多只有两个孩子结点。每个结点都有一个整数权值val。如果某个结点的权值是X,那么她的左子树的结点权值都小于X,右子树的结点权值都大于X。
现在要通过依次插入N个整数构造出二叉查找树,每个整数范围【1,N】,且都不相同,即要插入的序列是一个排列。第一个被插入的整数作为树根结点root,接下来依次插入剩下的N-1个整数,每次插入一个整数就相当于执行函数:insert(X, root),其中insert(X, root)递归过程如下:

insert( number X, node now )
{
计数器C 加1
if 待插入的整数X小于结点now的权值 then
{
if 结点now无左孩子 then
新建一个权值为X的结点,并设置为now的左孩子
else insert(X, now的左孩子)
}
else
{
if 结点now无右孩子 then
新建一个权值为X的结点,并设置为now的右孩子
else insert(X, now的右孩子)
}
}
其中:计数器C是全局变量,初始值是0。

Input

第一行,一个整数 N (1 ≤ N ≤ 300000)。
接下来有N行,每行一个整数,每个整数的范围是[1, N],且所有待插入的整数都不相同。

Output

共N行,每行以一个整数,第i行输出的结果表示的意义是:把第i个整数插入到查找二叉树后,计数器C的值是多少。

Sample Input

输入1:
4
1
2
3
4
输入2:
5
3
2
4
1
5
输入3:
8
3
5
1
6
8
7
2
4

Sample Output

输出1:
0
1
3
6
输出2:
0
1
2
4
6
输出3:
0
1
2
4
7
11
13
15

题目大意

建一个二分查找树,每一次插入新的元素时,输出在这之前所有的深度(也就是ans+=d[i])

思路

显然按照题目描述打50分肯定是有的哩,之后呢我们就会发现,一个数它的深度应该是它爸爸的深度+1(废话),但是它的爸爸呢很显然,要不是比它大的数中最小的数(前驱),就是比它小的数中最大的数(后继)。结果呢就可以得到d[i]=max(d[前驱],d[后继])+1。

那么就比较轻松 ,这个呢用双向链表,线段树都是可以的,但是呢,双向链表不会,线段树也只会简单的,结果导致这个半个月前的水 题,拖到现在。忍无可忍,无需再忍!“好像可以搞平衡树哦”,“平衡树?学学”,结果。。。懂了是懂了,但是他们的那个代码,真心自闭啊。“set不就是用红黑树的嘛”,“对哟,set!”,结果一整天都在学指针和迭代器,心里苦。

不过好歹会了嘛,起码会用了什么lower_bound之类的。

还是说两嘴迭代器吧。

迭代器

迭代器是今天才正式涉及的,说的不精准还请见谅,大概嘛,跟指针差不多,就我的理解,应该是储存一个数的地址,那要它干什么呢,比如像等会用的set,里面的lower_bound(x)就是指在集合里找到>=x的最小的数的迭代器,(啊,好绕啊,就是地址,我就是这么理解的),好了像定义之类的等会到程序里再说。

上代码

#include<cstdio>
#include<iostream>
#include<set>
#define N 300007
using namespace std;
long long n,ans,d[N],a[N];//保险起见longlong,d为深度
int main(){
	scanf("%lld",&n);
	scanf("%lld",&a[1]);//先将第一个数输进来,方便点
	printf("0\n");//第一个输出必定是0
	set<long long>A;
	A.insert(a[1]);//将a[1]放进集合
	d[a[1]]=0;//注意是a[1]这个值的深度,不是1的深度。
	for(int i=2;i<=n;i++){
		scanf("%lld",&a[i]);
		set<long long>::iterator A1,A2;//好了这里就是定义一个迭代器了,类型::iterator 变量名
		A1=A.lower_bound(a[i]);//跟上面说的一样
		A2=A1;//这个时候它们都是后继(如果a[i]有后继的话)
		if(A1!=A.begin()) A1--;
		if(A2==A.end()) A2--;
		//A1为前驱,A2为后继。若A1为第一个数的地址的话,那么说明没有前驱,若A2为end(),说明没有找到,也就是没有后继
		d[a[i]]=max(d[*A2],d[*A1])+1;//疑问为什么有*号,因为A1,A2是迭代器,是地址,要想调用地址上的值,就要加上*
		ans+=d[a[i]];
		printf("%lld\n",ans);
		A.insert(a[i]);//一定放下面,因为迭代器会自动更新的
	}
} 
华为[ENSP]OSPF的配置实例(单区域+多区域) 阅读详情

相关推荐

【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下: 只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下: 要求完成功能:实现数.

XiaoCaiDaYong的博客 8265

【题解】NOI2009二叉查找树 + NOIP2003加分二叉树

  自己的思维能力果然还是太不够……想到了这棵树所有的性质即中序遍历不变,却并没有想到怎样利用这一点。在想这道题的过程中走入了诸多的误区,在这里想记录一下 & 从中吸取到的教训(原该可以避免的吧)。   1. 注意到了中序遍历不变的性质却不会使用。   2. 注意到只有相对大小才会影响树的形态,在考虑的时候一直在想如何改变一个数的位置关系,分析修改权值对于树产生的影响。但这样是很难分析...

weixin_30521649的博客 163

RK3588嵌入式开发:从零构建Rockit多媒体处理引擎的实战指南

本文详细介绍了如何在RK3588嵌入式平台上从零构建Rockit多媒体处理引擎的实战指南。涵盖开发环境搭建、工具链配置、源码编译流程、硬件加速优化及典型问题解决方案,帮助开发者高效利用RK3588的NPU和VPU加速特性,实现高性能多媒体处理应用。

mango的博客 187

NOIp模拟 二叉搜索树

船送门 用四边形不等式优化的区间DPDPDP。 至于四边形不等式,特征一般都很明显,而且这东西很偏。记结论,然后给决策点打表找规律就行了吧。 由决策点的单调性把O(n3)O(n^3)O(n3)优化成O(n2)O(n^2)O(n2)。 #include<bits/stdc++.h> #define ll long long #define re register #define cs c...

g21wcr的博客 262

微信小程序内容安全审核:从API调用到工程化落地的全流程实践

内容安全是互联网应用开发中的基础性技术环节,尤其在用户生成内容(UGC)场景下,它直接关系到平台的合规性与用户体验。其核心原理通常结合了关键词过滤、自然语言处理(NLP)和计算机视觉(CV)等技术,通过AI模型对文本、图像、音频进行多维度风险识别。这项技术的价值在于,它不仅是满足监管要求的必要手段,更是构建健康社区生态、保护品牌声誉、实现产品长期稳定运营的基石,广泛应用于社交、电商、社区论坛等各类UGC平台。本文聚焦于微信小程序生态,深入剖析其官方提供的内容安全解决方案,详细解读如何将文本同步检测与多媒体异

weixin_28622215的博客 453

IntelliJ IDEA 2025.1 + Gradle 镜像配置避坑指南:解决依赖下载慢的终极方案

本文针对IntelliJ IDEA 2025.1开发环境中Gradle依赖下载缓慢的问题,提供了详细的镜像配置避坑指南。通过解析Gradle依赖解析机制,重点指导如何正确配置阿里云等国内镜像仓库,并分享验证配置生效、排查常见错误及高级优化技巧,旨在彻底解决依赖下载难题,提升开发效率。

weixin_28835551的博客 532

二叉搜索树(BST)插入与查找

二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(ordered binary tree),排序二叉树(sorted binary tree)二叉查找树的性质: 1.任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2.任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3.任意节点的左、右子树也分别为二叉查找树; 4.没

1256

【unity游戏开发入门到精通——UGUI】UI控件 —— Image图像控件

【unity游戏开发入门到精通——UGUI】UI控件 —— Image图像控件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2357

[NOIpPJ2018]对称二叉树——[搜索]

【题意分析】 稍微画下图就知道:对称二叉树的一个节点,左儿子的右儿子和右儿子的左二子一样 那岂不是一个dfs就解决了 Code: #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include ...

sleepyNick 247

3、无限维系统理论中的算子与半群:概念、定理及应用

本博文深入探讨了无限维系统理论中的两个核心概念:里茨谱算子与卢默-菲利普斯定理。文章首先介绍了里茨基的定义与性质,分析了谱、预解集及特征值在无限维系统中的特性,并详细阐述了里茨谱算子的条件及其生成C0-半群的能力,结合阻尼欧拉-伯努利梁模型展示了其应用。随后,文章介绍了卢默-菲利普斯定理及其推论,通过多个偏微分方程实例(如一阶方程、柔性梁、波动方程和扩散问题)说明如何利用该定理判断算子是否生成压缩半群。此外,还强调了状态空间选择和边界条件对系统适定性的重要影响,并总结了相关问题的解决步骤与方法。

flink9streamer的博客 148

【STM32+K210项目】基于K210智能人脸识别+车牌识别系统(完整工程资料源码)

随着时代的进步和科技的迅猛发展,人们对居住安全的重视程度不断提升,对安全防范系统的需求也日益增强。在安防系统中,门禁系统占据着重要的位置。传统的门禁控制方式主要依靠钥匙、密码和门禁卡等,这些方式易于被破解和复制,安全性较低。然而,近年来,生物识别技术的迅速发展和成熟,为解决这一问题提供了新的方案。生物识别技术具备便携性、非易失性、不易遗忘以及难以盗用等优点,逐渐被引入到门禁系统中。传统的小区门禁系统往往依赖人工管理,存在一定的局限性,难以满足用户多样化的需求,也浪费了人力资源。

嵌入式技术开发 1万+

bzoj1564: [NOI2009]二叉查找树

传送门 改变后的权值不能相同 但是由于可以改成任意实数 而且代价与更改的大小无关 所以其实相同与否无所谓了 所以题目有时也有废话 首先键值是不能更改的 而一棵treap的中序遍历保证键值递增 故中序遍历一定 我们先按照键值排序得到中序遍历 w很大 但是保证不重复 所以我们将w离散化 然后就是DP的问题了。。我们令f[i][j][w]表示从i~j的节点构成一棵子树且所有节点权值都大于等于w的

zyy大蒟蒻的博客 436

YOLOv11 TensorRT极致加速:C++部署性能优化完全指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

LXY_LOVE36的博客 118

2020.7.21 T4WTF交换(jz暑假训练day6)

sum = 0 for i = 1 to N index = min{ ID[i], ID[i+1] } sum = sum + A[index] 将数组A往右循环移动R位 将数组A内所有的数取相反数 for i = 1 to N index = max{ ID[i], ID[i+1] } index = index + 1 sum = sum + A[index] 将数组A往右循环移动R位

jay_zai的博客 4886

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

有根树的同构

有根数的同构 题目大意 主要是判断给你的k棵有根树,问哪几个树是同构的 发一下原题吧: 图的同构是指两个图“相同”,这有着广泛的应用。比如当我们要对一批图施行某种操作的时候,如果我们能发现其中一些图是同构的,我们就可以在这些同构的图中只保留一个,从而降低工作量。比如,上图中的T1和T3就是同构的。 下面我们给出图的同构的定义。给出两个图G1=(V1,E1),G2=(V2,E2)。如果存在一个V1到...

jay_zai的博客 721

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

2020.7.22 T1三色树(jz暑假训练day7)

Description 给出一个N个节点的无根树,每条边有非负边权,每个节点有三种颜色:黑,白,灰。 一个合法的无根树满足:树中不含有黑色结点或者含有至多一个白色节点。 现在希望你通过割掉几条树边,使得形成的若干树合法,并最小化割去树边权值的和。 Input 第一行一个正整数N,表示树的节点个数。 第二行N个整数Ai,表示i号节点的颜色,0 表示黑色,1表示白色,2表示灰色。 接下来N-1行每行三个整数Xi Yi Zi,表示一条连接Xi和Yi权为Zi的边。 Output 输出一个整数表示其最小代价。 Sam

jay_zai的博客 598

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2020.01.19【NOIP提高组】模拟B 组——总结——数字排序

Description 给你两个数列A=(a1,a2,a3,…,an)和B=(b1,b2,b3,…,bm),把ai (1<=i<=n)和bj (1<=j<=m)乘起来,得到一个新的有m*n个数的数列。把这个序列排列成非递减数列,然后请找出排在第k位的数。 Input 输入有多组数据。 每组数据的第一行包含三个整数:n(1<=n<=10000), m(1<=...

jay_zai的博客 484

2020.7.27T4花花的聚会(jz暑假训练day11)

Description Input Output Sample Input 7 7 3 1 2 1 7 6 6 3 5 3 4 3 7 2 3 7 1 1 2 3 5 3 6 2 4 2 4 5 3 10 6 1 20 3 5 6 7 Sample Output 10 22 5 Data Constraint Hint 赛时 考虑一个部分分的dp,然后空间竟然爆掉了!!! 结果40分 正解(呸 ) 一坨大佬暴力解决???加个小小剪枝?(if(当前答案>ans)return) 然后水题开始 #

jay_zai的博客 466

2020.7.22 T3押韵(jz暑假训练day7)

Description 小A非常喜欢所有押韵的东西,他认为两个单词押韵当且仅当他们的公共后缀的长度和两个单词中最长的单词的长度相等,或者是最长的单词的长度减一。也就是说LCS(A,B)>=max(|A|,|B|)-1。 有一天,小A读了一个有N个单词的小故事,他想知道,如果挑选一些故事里出现的单词组成一个新的单词序列,能组成的最长的满足以下条件的单词序列的长度是多少:单词序列中任意相邻的两个单词都押韵。(每个单词最多只能用一次) Input 第一行包含一个正整数N(1<=N<=500000

jay_zai的博客 462

2020.7.16 T1【NOIP2015模拟10.29B组】质数(jz暑假训练day2)

Description 定义质数为因数只含1和其本身的数,对于N组询问,试判断每个数是否为素数。 Input 第一行一个正整数N,表示有N组询问。 接下来N行,每行一个正整数M,表示询问M是否为质数。 Output 输出N行,每行一个字符串。 若是质数则输出‘Prime’,若不是质数则输出‘Not prime’。 Sample Input 5 2 10 89807289 9032482948 1000000007 Sample Output Prime Not prime Not prime Not pri

jay_zai的博客 418

2020.7.15 资源勘探(jz暑假训练day1)

资源勘探 Description 教主要带领一群Orzer到一个雄奇地方勘察资源。   这个地方可以用一个n×m的矩阵A[i, j]来描述,而教主所在的位置则是位于矩阵的第1行第1列。   矩阵的每一个元素A[i, j]均为一个不超过n×m的正整数,描述了位于这个位置资源的类型为第A[i, j]类。教主准备选择一个子矩阵作为勘察的范围,矩阵的左上角即为教主所在的(1, 1)。若某类资源k在教主勘察的范围内恰好出现一次。或者说若教主选择了(x, y)即第x行第y列作为子矩阵的右下角,那么在这个子矩阵中只有一个

jay_zai的博客 401

2020.7.15 最大配对(jz暑假训练day1)

最大配对 Description 给出2个序列A={a[1],a[2],…,a[n]},B={b[1],b[2],…,b[n]},从A、B中各选出k个元素进行一一配对(可以不按照原来在序列中的顺序),并使得所有配对元素差的绝对值之和最大。 例如各选出了a[p[1]],a[p[2]],……,a[p[k]]与b[q[1]],b[q[2]],……,b[q[k]],其中p序列中的元素两两不相 同,q序列中的元素两两不相同,那么答案为|a[p[1]]-b[q[1]]|+|a[p[2]]-b[q[2]]|+……+|a

jay_zai的博客 398

2020.01.18【NOIP提高组】模拟B 组——总结——选择困难症

Description 又到吃饭时间,Polo面对饭堂里琳(fei)琅(chang)满(keng)目(die)的各种食品,又陷入了痛苦的抉择中:该是吃手(jiao)打肉饼好呢,还是吃豆(cai)角(chong)肉片好呢?嗯……又不是天秤座怎么会酱紫呢? 具体来说,一顿饭由M个不同的部分组成(荤菜,素菜,汤,甜品,饮料等等),Polo要在每个部分中选一种作为今天的午饭。俗话说的好,永远没有免费的午餐...

jay_zai的博客 358

2020.7.18 T2Captcha(jz暑假训练day4)

大意 提莫大意就是给个这个玩意儿: 样例输进来有问题。。。。。。就是说每次给你一些如上面的框框,对于每个框框,求一下表示的是哪个数字 解 这个题直接暴力就行了,我是记录每个框框有 **.**的五行,每行多少个点,那么如0就是3 2 2 2 3,大概如此。然后就发现2,3,5都是3,1,3,1,3那么再记录一下它们第二行,第四行是什么就行了,这种题普遍打得丑,代码就不放了。 ...

jay_zai的博客 346

2020.01.19【NOIP提高组】模拟B 组——总结——水池

Description 有一个圆形的水池,水池的圆心坐标为(0, 0)。有座桥跨越水池,桥可以看作直线段AB,A点和B点都在水池边上。 Merlin想从F点走到G点,并且F点和G点都在水池边上,但是他不会游泳。请告诉他从F点到G点的最短路程是多少。 Input 输入有多组数据。 每组数据的第一行是一个整数R (1<=R<=100), 表示水池的半径。 第二行包含8个实数XA, YA, ...

jay_zai的博客 345

2020.7.15 排列统计 (jz暑假训练day1)

排列统计 Description 对于给定的一个长度为n的序列{B[n]},问有多少个序列{A[n]}对于所有的i满足:A[1]~A[i]这i个数字中有恰好B[i]个数字小等于i。其中{A[n]}为1~n的一个排列,即1~n这n个数字在序列A[I]中恰好出现一次。   数据保证了至少有一个排列满足B序列。 Input 输入的第1行为一个正整数N,表示了序列的长度。   第2行包含N个非负整数,描述了序列{B[i]}。 Output 输出仅包括一个非负整数,即满足的{A[i]}序列个数。 Sample Inp

jay_zai的博客 337
上一篇: 如何让自己像打王者荣耀一样发了疯、拼了命、石乐志的学习?
下一篇: jzoj2020.06.06【NOIP提高组】模拟
jay_zjy1022
博客等级 码龄7年 11粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值