给个板子题

笛卡尔树是这样的一种数据结构:对于 \(n\) 个二元组 \((key, value)\) 形成的笛卡尔树,满足如下性质

其 \(key\) 值满足二叉搜索树性质 (中序排列单调递增),\(value\) 值满足堆性质

给出若干个 \((key, value)\) 二元组,采取以下方式构建一颗笛卡尔树 (以大根堆笛卡尔树为例)

将二元组按照 \(key\) 值排序,并逐个添加进笛卡尔树中,且添加的位置一定是某个 最右结点 (即从根往右第一个没有右儿子的结点),这是为了满足二叉搜索树的性质

  1. 若当前待添加结点 \(value\) 大于根的 \(value\) ,则将其设为根,并将原来的根作为其左儿子
  2. 否则,从根往 走,直到找到某个结点 \(w\) 的 \(value\) 小于待添加结点,则将待添加结点取代 \(w\) 的位置并将 \(w\) 作为该节点的左儿子
  3. 若找不到 \(value\) 比待添加结点小的结点,则将其作为最右结点的右儿子接入

在实际代码编写中,第二种情况与第三种情况可以合并

#include <iostream>
#include <string>
#include <algorithm> using namespace std; const int MAX_N = 51000; string lab[MAX_N];
int son[MAX_N][2], pri[MAX_N];
int root; struct Node {
string l; int p;
Node(){}
Node(string _l, int _p) : l(_l), p(_p) {}
bool operator < (const Node& c) const { return l < c.l; }
} a[MAX_N]; inline int toInt(string s) {
int res = 0;
for (int i = 0; i < s.size(); ++i) {
res *= 10;
res += (s[i] - '0');
}
return res;
} void dfs(int p) {
cout << '(';
if (son[p][0])
dfs(son[p][0]);
cout << lab[p] << '/' << pri[p];
if (son[p][1])
dfs(son[p][1]);
cout << ')';
} int main() { int n;
while (cin >> n) {
if (n == 0) break;
for (int i = 1; i <= n; ++i)
son[i][0] = son[i][1] = 0;
root = 0;
for (int i = 1; i <= n; ++i) {
string node;
cin >> node;
int pos = node.find('/');
a[i] = Node(node.substr(0, pos), toInt(node.substr(pos + 1)));
}
sort(a + 1, a + n + 1);
for (int cur = 1; cur <= n; ++cur) {
lab[cur] = a[cur].l;
pri[cur] = a[cur].p;
if (!root || pri[cur] >= pri[root]) {
son[cur][0] = root;
root = cur;
} else {
int p = root;
while (son[p][1] && pri[son[p][1]] > pri[cur]) p = son[p][1];
son[cur][0] = son[p][1];
son[p][1] = cur;
}
}
dfs(root);
cout << endl;
} return 0;
}

最新文章

  1. c模拟c++ const 转换
  2. Java Thread 的使用
  3. Ubuntu 查看和杀死进程
  4. 配置ogg异构oracle-mysql(3)目的端配置
  5. 如何获取网页上的LOGO
  6. 用RPM包安装MySQL的默认安装路径问题
  7. 静态代理VS动态代理
  8. SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND &lt;0.5MB MODEL SIZE
  9. 【深圳,武汉】一加科技(One Plus)招聘,寻找不...
  10. 《Mastering Opencv ...读书笔记系列》车牌识别(II)
  11. Xamarin截取/删除emoji表情bug解决方案
  12. XUnit 依赖注入
  13. 全国天气预报信息数据 API 功能简介与代码调用实战视频
  14. 如何以system身份运行指定的程序?
  15. Nginx range filter模块数字错误漏洞修复 (Nginx平滑升级) 【转】
  16. Django项目的创建及基本使用
  17. selective search
  18. dp填表法,刷表法
  19. .NET Memory Allocation Profiling with Visual Studio 2012
  20. swift - 加速器/摇一摇功能

热门文章

  1. MSSQL执行超大.sql脚本
  2. Python的入门复习一 Day 8——from“夜曲编程”
  3. popen函数和pyinstaller打包之 -w冲突
  4. 2023 新年FLAG 当你无所事事的时候,打开本博客看看,置顶着呢,别说你看不到,摸鱼狗
  5. java将Word转换成PDF方法
  6. 我们后端代码这样子设置虽然这样子返回的是字符串,但是json字符串也是字符串
  7. linuxz中压缩解压缩文件
  8. Delphi 从字符串中提取数字
  9. oracle 分配权限命令
  10. [MySQL高级](一) EXPLAIN用法和结果分析