笛卡尔树 Cartesian tree
给个板子题
笛卡尔树是这样的一种数据结构:对于 \(n\) 个二元组 \((key, value)\) 形成的笛卡尔树,满足如下性质
其 \(key\) 值满足二叉搜索树性质 (中序排列单调递增),\(value\) 值满足堆性质
给出若干个 \((key, value)\) 二元组,采取以下方式构建一颗笛卡尔树 (以大根堆笛卡尔树为例)
将二元组按照 \(key\) 值排序,并逐个添加进笛卡尔树中,且添加的位置一定是某个 最右结点 (即从根往右第一个没有右儿子的结点),这是为了满足二叉搜索树的性质
- 若当前待添加结点 \(value\) 大于根的 \(value\) ,则将其设为根,并将原来的根作为其左儿子
- 否则,从根往 右 走,直到找到某个结点 \(w\) 的 \(value\) 小于待添加结点,则将待添加结点取代 \(w\) 的位置并将 \(w\) 作为该节点的左儿子
- 若找不到 \(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;
}
笛卡尔树 Cartesian tree的更多相关文章
- 笛卡尔树Cartesian Tree
前言 最近做题目,已经不止一次用到笛卡尔树了.这种数据结构极为优秀,但是构造的细节很容易出错.因此写一篇文章做一个总结. 笛卡尔树 Cartesian Tree 引入问题 有N条的长条状的矩形,宽度都 ...
- [模板] 笛卡尔树 && RMQ
话说我noip之前为什么要学这种东西... 简介 笛卡尔树(Cartesian Tree) 是一种二叉树, 且同时具有以下两种性质: 父亲节点的值大于/小于子节点的值; 中序遍历的结果为原序列. 笛卡 ...
- POJ 2201 Cartesian Tree ——笛卡尔树
[题目分析] 构造一颗笛卡尔树,然后输出这棵树即可. 首先进行排序,然后用一个栈维护最右的树的节点信息,插入的时候按照第二关键字去找,找到之后插入,下面的树成为它的左子树即可. 然后插入分三种情况讨论 ...
- NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]
题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...
- 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)
在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...
- [乱搞]hdu 6406 Taotao picks apples 笛卡尔树+倍增
题目链接 Problem Description There is an apple tree in front of Taotao's house. When autumn comes, n app ...
- Codeforces Round #114 (Div. 1) D. Wizards and Roads 笛卡尔树+树贪心+阅读题
D. Wizards and Roads 题目连接: http://www.codeforces.com/contest/167/problem/D Description In some count ...
- 笛卡尔树 POJ ——1785 Binary Search Heap Construction
相应POJ 题目:点击打开链接 Binary Search Heap Construction Time Limit: 2000MS Memory Limit: 30000K Total Subm ...
- HDU - 1506 Largest Rectangle in a Histogram (单调栈/笛卡尔树)
题意:求一个直方图中最大矩形的面积. 很经典的一道问题了吧,可以用单调栈分别求出每个柱子左右两边第一个比它低的柱子(也就相当于求出了和它相连的最后一个比它高的柱子),确定每个柱子的左右边界,每个柱子的 ...
- POJ-1785-Binary Search Heap Construction(笛卡尔树)
Description Read the statement of problem G for the definitions concerning trees. In the following w ...
随机推荐
- 如何添加Eclipse项目到SVN资源库
Eclipse项目添加到SVN版资源库有如下好处:一是轻松备份,每天做的修改内容一键提交:二方便合作,比较大的项目,多个人一起工作的时候,每人及时将完成的代码提交,别人可以下载浏览:三展示项目完成进度 ...
- dockerfile 打包镜像
打包镜像指令 docke人 build -t xxx -f dockerfile2 . xxx 镜像名称 -f 指定dockerfile2 文件 (多个文件的话) . 当前的上下文空间 dockerf ...
- SCI、SSCI、EI、北大中文核心期刊、CSCD、CSSC、SCD、CSSCI 扩展版、计算机软件著作权
https://zhidao.baidu.com/question/308484724.html SCI(科学引文索引).EI(工程索引).ISTP(科技会议录索引)是世界著名的三大科技文献检索系统, ...
- 安装kubernetes dashboard以及用户授权
kubernetes 版本v1.25.3 1.安装 版本查看:https://github.com/kubernetes/dashboard/releases kubectl apply -f htt ...
- 关于flex
flex 是 flex-grow.flex-shrink.flex-basis 的缩写. flex 的默认值是以上三个属性值的组合.假设以上三个属性同样取默认值,则 flex 的默认值是 0 1 au ...
- oracle 分配权限命令
Oracle分配权限 以管理员身份登录数据库 创建用户:create user [username] identified by [password]; 赋予登录权限:grant create ses ...
- 用有限差分估计(Finite Difference Estimate)解决地理坐标与平面像素坐标转换过程的误差造成风场粒子向量失真问题
下载NCEP的气象场grib2数据,风场是二维的向量,包含u和v两个分量.这个用经纬度投影到像素坐标会产生误差,直接绘制效果不太对:( 通过插值计算得到风场粒子的预测数据wind = interp ...
- 对mvc模式的理解
Model-View-Controller MVC模式是个威力强大的复合模式,是由数个设计模式结合起来的模式: 我们先看一下一个mp3播放器的设计,来由浅至深地了解这个设计模式的精髓所在: 从最直观的 ...
- 金蝶K3无法查看关联信息
场景: 某个用户点击采购订单界面--关联信息,界面显示正在加载,但是无法显示所有关联单据. 步骤: 1. 在其他电脑登录存在同样问题. 2. 其他模块可以正常显示 3. 删除该用户t_UserProf ...
- 一个新App上线应该注意什么?
一个新App上线应该关注哪些地方: 功能使用上无大问题遗留 用户使用体验尚佳 (前两条属于普通app更新也需要关注的点) 用户需要有反馈的入口,比如app内的反馈.用户可以直接联系到对应负责人进行反馈 ...