OpenJudge Cartesian Tree



【代码】
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = ;
//Tkey为输入主键与辅键的结构体
//key表示主键,aux表示辅键,index表示是输入的第几个结点
struct Tkey {
int key, aux, index;
} keys[maxn];
//Tnode是BST结点的结构体,key表示主键,aux表示辅键
//father表示父结点的编号,leftChild和rightChild表示左右儿子结点
struct Tnode {
int key, aux, father, leftChild, rightChild;
} node[maxn];
int n; //排序的比较函数
bool cmp(const Tkey &a, const Tkey &b) {
return a.key < b.key;
} int main() {
//读入数据
int i;
scanf("%d", &n);
for (i = ; i <= n; ++i) {
scanf("%d%d", &keys[i].key, &keys[i].aux);
keys[i].index = i;
} //按key对结点排序
sort(keys + , keys + n + , cmp); //按key从小到大将结点插入BST
//father表示当前插入结点的父节点,leftChild表示当前插入结点的左儿子节点
//rightMost表示每次插入前BST最右的结点
int p, father, leftChild, rightMost = ;
for (i = ; i <= n; ++i) {
//寻找插入结点的父亲与左儿子
leftChild = ; father = rightMost;
while (father != && node[father].aux > keys[i].aux) {
leftChild = father;
father = node[father].father;
}
//将结点插入BST
p = keys[i].index;
node[p].key = keys[i].key;
node[p].aux = keys[i].aux;
node[p].father = father;
node[p].leftChild = leftChild;
node[p].rightChild = ;
if (father != )
node[father].rightChild = p;
if (leftChild != )
node[leftChild].father = p;
rightMost = keys[i].index;
} //输出答案
printf("YES\n");
for (i = ; i <= n; ++i)
printf("%d %d %d\n", node[i].father, node[i].leftChild, node[i].rightChild);
return ;
}
OpenJudge Cartesian Tree的更多相关文章
- Algorithm: cartesian tree
http://baike.baidu.com/link?url=XUt5fXQ-jtFBM0UdKiGA41_NWFvdFSYwVsy4SVvCRRuEBvNkLfT9TgOtzsXvaOT9nuq_ ...
- [sgu P155] Cartesian Tree
155. Cartesian Tree time limit per test: 0.25 sec. memory limit per test: 65536 KB input: standard i ...
- 笛卡尔树Cartesian Tree
前言 最近做题目,已经不止一次用到笛卡尔树了.这种数据结构极为优秀,但是构造的细节很容易出错.因此写一篇文章做一个总结. 笛卡尔树 Cartesian Tree 引入问题 有N条的长条状的矩形,宽度都 ...
- PAT-2019年冬季考试-甲级 7-4 Cartesian Tree (30分)(最小堆的中序遍历求层序遍历,递归建树bfs层序)
7-4 Cartesian Tree (30分) A Cartesian tree is a binary tree constructed from a sequence of distinct ...
- Day6 - J - Cartesian Tree POJ - 2201
Let us consider a special type of a binary search tree, called a cartesian tree. Recall that a binar ...
- PAT-1167(Cartesian Tree)根据中序遍历序列重建最小堆
Cartesian Tree PAT-1167 一开始我使用数组进行存储,但是这样可能会导致无法开足够大的数组,因为树如果是链表状的则无法开这么大的数组(虽然结点很少). 正确的解法还是需要建树,使用 ...
- POJ 2201 Cartesian Tree ——笛卡尔树
[题目分析] 构造一颗笛卡尔树,然后输出这棵树即可. 首先进行排序,然后用一个栈维护最右的树的节点信息,插入的时候按照第二关键字去找,找到之后插入,下面的树成为它的左子树即可. 然后插入分三种情况讨论 ...
- SGU 155.Cartesian Tree
时间限制:0.25s 空间限制:6M 题意: 给出n(n< 50000)个含双关键字(key,val)的节点,构造一颗树使该树,按key值是一颗二分查找树,按val值是一个小根堆. Soluti ...
- CF1290E Cartesian Tree
考虑笛卡尔树的意义: 一个点在笛卡尔树中的子树,代表以他为最小/最大值的区间. 所以一个点的子树大小,一定是类似到达序列边界或者被一个比他更大的数隔离. 考虑记录 \(l_i,r_i\) 为第 \(i ...
随机推荐
- gearman 简单试用
服务启动 使用yum 的安装包 安装server yum install -y gearmand 启动 systemctl restart gearmand 启动worker gearman ...
- python 高阶函数学习, map、reduce
一个函数可以接收另一个函数作为参数,这样的函数叫做高阶函数. 函数map(): map()函数接收两个参数,一个是函数,一个是Iterable, map把函数作用于序列的每一个元素,并把结果作为Ite ...
- Vision GUI programming products
Matrox Design Assistant Tutorial https://www.youtube.com/watch?v=QnE5heA_yWQ merlic https://www.yout ...
- 怎么检测浏览器有没有flash播放器
虽然现在大多浏览器都支持了HTML5的新特性,可以直接在网页上播放视频,通过<video>标签即可,但是大多数的浏览器对H5支持还是不够完整,或者很多用户还没有把浏览器升级到最新的版本,尤 ...
- linux centos6 yum 安装lamp
centos 6.5 1.yum安装和源代码编译在使用的时候没啥区别,但是安装的过程就大相径庭了,yum只需要3个命令就可以完成,源代码需要13个包,还得加压编译,步骤很麻烦,而且当做有时候会出错,源 ...
- LOJ 2587 「APIO2018」铁人两项——圆方树
题目:https://loj.ac/problem/2587 先写了 47 分暴力. 对于 n<=50 的部分, n3 枚举三个点,把图的圆方树建出来,合法条件是 c 是 s -> f 路 ...
- 公式推导:【CFNet】
[CFNet]: Valmadre J, Bertinetto L, Henriques J F, et al. End-to-end representation learning for Corr ...
- asp.net core 中KindEditor的使用
主要是需要对上传图片和文件管理的服务端进行改造 public class KindEditorController : Controller { private IHostingEnvironment ...
- 大数据离线分析平台 JSSDK数据收集引擎编写
JsSDK设计规则在js sdk中我们需要收集launch.pageview.chargeRequest和eventDuration四种数据,所以我们需要在js中写入四个方法来分别收集这些数据,另外我 ...
- Hyperledger fabric 1.3版本的安装部署(原创多机多Orderer部署
首先,我们在安装前,要考虑一个问题 Hyperledger Fabric,通过指定的节点进行背书授权,才能完成交易的存储 延伸开来,就是为了实现容错.高并发.易扩展,需要zookeeper来选择排序引 ...