问题描述

众所周知,二叉查找树的形态和键值的插入顺序密切相关。准确的讲: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 树的序的更多相关文章

  1. 洛谷 P1377 [TJOI2011]树的序 解题报告

    P1377 [TJOI2011]树的序 题目描述 众所周知,二叉查找树的形态和键值的插入顺序密切相关.准确的讲:1.空树中加入一个键值\(k\),则变为只有一个结点的二叉查找树,此结点的键值即为\(k ...

  2. 单调队列优化O(N)建BST P1377 [TJOI2011]树的序

    洛谷 P1377 [TJOI2011]树的序 (单调队列优化建BST 链接 题意分析 本题思路很简单,根据题意,我们利用所给的Bst生成序将Bst建立起来,然后输出该BST的先序遍历即可: 但,如果我 ...

  3. Luogu P1377 [TJOI2011]树的序:离线nlogn建二叉搜索树

    题目链接:https://www.luogu.org/problemnew/show/P1377 题意: 有一棵n个节点的二叉搜索树. 给出它的插入序列,是一个1到n的排列. 问你使得树的形态相同的字 ...

  4. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  5. [TJOI2011]树的序(贪心,笛卡尔树)

    [TJOI2011]树的序 题目描述 众所周知,二叉查找树的形态和键值的插入顺序密切相关.准确的讲:1.空树中加入一个键值k,则变为只有一个结点的二叉查找树,此结点的键值即为k:2.在非空树中插入一个 ...

  6. 洛谷P3018 [USACO11MAR]树装饰Tree Decoration

    洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...

  7. 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)

    洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...

  8. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

  9. 洛谷P3372线段树1

    难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...

随机推荐

  1. UEFI手札

    基于Intel TianoCore衍生的EDK-II诞生的UEFI,用来取代Legacy BIOS. INF文件 Module Information File,模块描述文件.Module可以是可执行 ...

  2. base64加密小案例

    python终端下: import base64 >>> dict='{"name":"tom"}' >>> dict.en ...

  3. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_7_File类创建删除功能的方法

    createNewFile() createNewFile抛出了异常 抛出了一个IO异常 所有我们调用方法的时候必须处理异常 throws这个异常 返回结果为true 最终创建好的文件 再次执行代码. ...

  4. spring boot配置项profiles active

    结论:通用项配置在applicaton.yml,区别环境配置在application-{profile}.yml中 一直不知道这个参数要不要配,配了有什么用,今天搭一个工程来检验 此项作用:用来区分不 ...

  5. jmeter之关联操作

    测试接口过程中,常常会遇到这样的一个情况:上一个请求返回的数据,另外一个接口需要要使用.那么,使用Jmeter操作时我们常常可以用“关联”来实现. 以接口“登录”和“金币充值”为例:即在做“金币充值” ...

  6. 16/7/7_PHP-Static静态关键字

    Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { private stat ...

  7. django中orm多表查询,减少数据库查询操作

    .select_related()   的使用

  8. vue—两个数组,去重相同项

  9. Flash存储模块调试

    Flash存储模块 Flash存储模块之前SPI一直读deviceID有问题原因如下: 用正点原子的例程是可以的,但是转移到自己的工程项目里就不行!!原因是正点原子没有在SPI初始化里     RCC ...

  10. body传参?parameter传参?Request Payload?Query String Parameter?

    今天,是有委屈的一天:今天,是有小情绪的一天.所以,我们要对今天进行小结,跟它做一个了断! 今天,后端来一个接口,告诉我"要用post请求,parameter形式传参".over. ...