[洛谷 P1377] TJOI2011 树的序
问题描述
众所周知,二叉查找树的形态和键值的插入顺序密切相关。准确的讲:1、空树中加入一个键值k,则变为只有一个结点的二叉查找树,此结点的键值即为k;2、在非空树中插入一个键值k,若k小于其根的键值,则在其左子树中插入k,否则在其右子树中插入k。
我们将一棵二叉查找树的键值插入序列称为树的生成序列,现给出一个生成序列,求与其生成同样二叉查找树的所有生成序列中字典序最小的那个,其中,字典序关系是指对两个长度同为n的生成序列,先比较第一个插入键值,再比较第二个,依此类推。
输入格式
第一行,一个整数,n,表示二叉查找树的结点个数。第二行,有n个正整数,k1到kn,表示生成序列,简单起见,k1~kn为一个1到n的排列。
输出格式
一行,n个正整数,为能够生成同样二叉查找数的所有生成序列中最小的。
样例输入
4
1 3 4 2
样例输出
1 3 2 4
解析
根据题目要求,我们可以这么想:字典序最小的构法肯定是从小到大插入,但最后构出来的树会是一条链。我们可以设一个节点有两个关键值:一是本身的值,二是第几个插入。我们需要这棵树越往上第二关键字越小,即每个节点的第二关键字小于自己的两个儿子(不然不满足原树的顺序),整棵树的第一关键字又要满足二叉搜索树,这就是一棵笛卡尔树。
笛卡尔树的构造方法是:首先把所有节点按照第一关键字排序,这样构造出来的树就是一条在最右边的链。用一个栈保存最右边链的节点。对于每一个插入的节点i,都在栈中找到第一个第二关键字比自己小的点,并将i作为这个点的右儿子,而原来接的右链接到i的左儿子处,并从栈中弹出。最后中序遍历整棵树的序列即为答案。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 100002
using namespace std;
struct node{
int dat,key;
}a[N];
int n,i,fa[N],dat[N],key[N],son[N][2],s[N],top;
int my_comp(const node &x,const node &y)
{
return x.dat<y.dat;
}
void insert(int x,int f,int p)
{
fa[x]=f;
son[f][p]=x;
}
void dfs(int x)
{
if(!x) return;
cout<<dat[x]<<' ';
dfs(son[x][0]);
dfs(son[x][1]);
}
int main()
{
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i].dat;
a[i].key=i;
}
sort(a+1,a+n+1,my_comp);
for(i=1;i<=n;i++){
int last=0;
while(top>0&&key[s[top]]>a[i].key) last=top,top--;
dat[i]=a[i].dat;
key[i]=a[i].key;
insert(i,s[top],1);
insert(s[last],i,0);
s[++top]=i;
}
dfs(son[0][1]);
cout<<endl;
return 0;
}
[洛谷 P1377] TJOI2011 树的序的更多相关文章
- 洛谷 P1377 [TJOI2011]树的序 解题报告
P1377 [TJOI2011]树的序 题目描述 众所周知,二叉查找树的形态和键值的插入顺序密切相关.准确的讲:1.空树中加入一个键值\(k\),则变为只有一个结点的二叉查找树,此结点的键值即为\(k ...
- 单调队列优化O(N)建BST P1377 [TJOI2011]树的序
洛谷 P1377 [TJOI2011]树的序 (单调队列优化建BST 链接 题意分析 本题思路很简单,根据题意,我们利用所给的Bst生成序将Bst建立起来,然后输出该BST的先序遍历即可: 但,如果我 ...
- Luogu P1377 [TJOI2011]树的序:离线nlogn建二叉搜索树
题目链接:https://www.luogu.org/problemnew/show/P1377 题意: 有一棵n个节点的二叉搜索树. 给出它的插入序列,是一个1到n的排列. 问你使得树的形态相同的字 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- [TJOI2011]树的序(贪心,笛卡尔树)
[TJOI2011]树的序 题目描述 众所周知,二叉查找树的形态和键值的插入顺序密切相关.准确的讲:1.空树中加入一个键值k,则变为只有一个结点的二叉查找树,此结点的键值即为k:2.在非空树中插入一个 ...
- 洛谷P3018 [USACO11MAR]树装饰Tree Decoration
洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...
- 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)
洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...
- NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...
- 洛谷P3372线段树1
难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...
随机推荐
- centos双网卡配置
centos双网卡问题,一个网卡配置局域网,一个网卡配置公网,如果内网访问自动走eth1,如果外网访问自动走eth2. 需要配置路由吗? 1. 首先查看机器是否是双网卡,命令如下: lspci | g ...
- GMM demo
# GMM model # // library(mvtnorm) ) n1 = n2 = mu1 = c(,) mu2 = c(-,-) sigma1 = matrix(c(,.,.,),nrow= ...
- 《图解设计模式》读书笔记8-1 Observer模式
目录 示例程序 程序类图 程序 角色和类图 角色 类图 思路拓展 可复用性 Observer的顺序 MVC模式 Observer模式 Observer模式即观察者模式,该模式中,被观察者的状态发生变化 ...
- postman的断言/环境变量的处理
我们做接口测试都会有一个断言操作:也有一个变量被频繁使用,这时候可以用环境变量来处理 目录 1.postman之断言 2.postman之环境变量 1.postman之断言 同样以postman的登录 ...
- git_04_回退到上个版本
前言 使用git版本控制的过程中,多人操作同一个项目时,有时经常会遇到代码冲突报错,一时又无法解决的问题,为了不影响他人正常使用这时便需要回滚代码至原来的版本.如何回滚代码至原来版,可参考以下步骤. ...
- HashMap为什么在多线程下会让cpu100%
首先HashMap并不是sun公司多线程提供的集合,很多时候我们的程序是一个主线程,用了hashmap并没有什么问题,但是在多线程下会出现问题. hashmap是一个哈希表,存储的数据结构也可以是一个 ...
- lambda表达式(2)
转:http://www.cnblogs.com/kingmoon/archive/2011/05/03/2035696.html "Lambda表达式"是一个匿名函数,是一种高效 ...
- GitHub Pages建立第一个静态页面
1.创建仓库 创建仓库点击右上角的加号,选择newrepository.然后对仓库信息进行设置.注意箭头标识的几个地方.仓库名必须是http://username.github.io的形式.必须勾选p ...
- STS安装Drools
download drools (including "Drools Engine" & "Drools and jBPM tools") from o ...
- K-th Number Poj - 2104 主席树
K-th Number Poj - 2104 主席树 题意 给你n数字,然后有m次询问,询问一段区间内的第k小的数. 解题思路 这个题是限时训练做的题,我不会,看到这个题我开始是拒绝的,虽然题意清晰简 ...