NC22596 Rinne Loves Data Structure
题目
题目描述
Rinne 喜欢 OI。在 9102 年的 PION 中,她在初赛遇到了这样一道题目:
阅读下列代码,然后回答问题。
补充:建树过程中会更新lc和rc,这实质上是一个二叉查找树的插入过程。
定义一个玄学节点叫做 R,每次操作读入 val ,执行 Insert(R,val)。
问题:每次 Insert 操作结束之后,输出当前节点的深度和。
这里我们定义 R 节点的深度为 0。
输入描述
第一行一个整数 N,表示操作次数。
接下来 N 行,第 i 行有一个值 ,表示第 i 次操作的 。
输出描述
N 行,每行输出该次操作完后的答案。
示例1
输入
8 3 5 1 6 8 7 2 4
输出
0 1 2 4 7 11 13 15
备注
。
题解
知识点:树,STL。
画图易知二叉排序树插入的节点有 种情况:插入节点比所有节点都小,那会存放在最小节点的左孩子;插入节点比所有节点都大,那会存放在最大节点的右孩子;插入节点比某子树根小,但比其左子树根大,那会存放在左子树的右孩子;插入节点比某子树根大,但比其右子树根小,那会存放在右子树的左孩子。
因为二叉排序树不能出现相同键值的节点,用 存储比较好,特判一下插入相同元素的情况。再用一个 存储相应节点的深度。
随后用 成员函数 (比STL泛用函数要快)查找第一个大于等于插入元素的节点位置,然后如果是 或者 ,则取相应的头/尾节点的深度加一;如果是中间某个元素,则取前后两个元素的深度最大值加一。最后别忘记插入回去。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> #define ll long long using namespace std; int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n; cin >> n; unordered_map<int, int> dep; set<int> s; ll ans = 0; while (n--) { int val; cin >> val; if (s.empty()) { s.insert(val); dep[val] = 0; cout << 0 << '\n'; continue; } auto pos = s.lower_bound(val); if (*pos == val) { cout << ans << '\n'; continue; } if (pos == s.begin()) dep[val] = dep[*pos] + 1; else if (pos == s.end()) pos--, dep[val] = dep[*pos] + 1; else { dep[val] = dep[*pos]; pos--; dep[val] = max(dep[*pos], dep[val]) + 1; } ans += dep[val]; s.insert(val); cout << ans << '\n'; } return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16461172.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧