题面见这里

大概是个模板题

Treap暴力插入的做法太暴力了并不优美

这里就需要用到笛卡尔树的构造方法,定义见这里

在 假的O(n) 的时间内构造一棵Treap

把元素从小到大排序

这样从小到大插入时,只会往树上最右边的链上走

这样考虑一下 Treap 正常的 Insert 的过程:

  只要找到第一个优先级更小(大根堆)的节点,将待插入节点插到上一层的右儿子的位置

  将当前找到的节点作为待插入节点的左儿子

这样就类似一个旋转操作,也就成功的模拟实现出了一个的 Treap 完整的 Insert 的过程

具体在代码里是这样的:

  用一个单调栈维护整个树的最右边的链

  边找符合要求的节点边出栈

  找到之后进行上面提到的操作即可

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<stack>
using namespace std; const int MAXN = 500001; struct Node{
int ch[2], val, prio;
Node(){ch[0] = ch[1] = val = 0;}
bool operator < (const Node &b) const{
return val < b.val;
}
}t[MAXN];
int n, top, stk[MAXN]; inline int rd() {
register int x = 0;
register char c = getchar();
register bool f = false;
while(!isdigit(c)) {
if(c == '-') f = true;
c = getchar();
}
while(isdigit(c)) {
x = x * 10 + (c ^ 48);
c = getchar();
}
return f ? -x : x;
}
stack<int> dfs;
bool vis[MAXN];
void Recycle() {
dfs.push(stk[1]);
vis[0] = true;
while(dfs.size()) {
int cur = dfs.top();
if(!vis[cur]) {
vis[cur] = true;
printf("%d ", t[cur].val);
}
if(!vis[t[cur].ch[0]]) dfs.push(t[cur].ch[0]);
else if(!vis[t[cur].ch[1]]) dfs.push(t[cur].ch[1]);
else dfs.pop();
}
return;
} int main() {
freopen("treap.in", "r", stdin);
freopen("treap.out", "w", stdout);
n = rd();
for(int i = 1; i <= n; ++i) t[i].val = rd();
for(int i = 1; i <= n; ++i) t[i].prio = rd();
sort(t + 1, t + n + 1);
stk[++top] = 1;
for(int i = 2; i <= n; ++i) {
int last = 0;
while(top and t[stk[top]].prio > t[i].prio) last = stk[top--];
t[i].ch[0] = last;
if(top) t[stk[top]].ch[1] = i;
stk[++top] = i;
}
//printf("root %d\n", stk[1]);
Recycle();
fclose(stdin);
fclose(stdout);
return 0;
}

  


COGS2421 [HZOI 2016]简单的Treap的更多相关文章

  1. [补档][HZOI 2016]简单的Treap

    [HZOI 2016]简单的Treap 题目 Treap是一种平衡二叉搜索树,除二叉搜索树的基本性质外,Treap还满足一个性质: 每个节点都有一个确定的优先级,且每个节点的优先级都比它的两个儿子小( ...

  2. COGS 2421.[HZOI 2016]简单的Treap 题解

    题目大意: 给定n个数及其优先级,求对应的符合最小堆性质的Treap的先序遍历. n<=500000. 解法: 目前为止我只想到了三种解法,其中第三种是正解. 1.暴力1 以优先级为关键字排序, ...

  3. [COGS 2421] [HZOI 2016] 简单的Treap 笛卡尔树

    笛卡尔树就是你给两维限制,一维堆R,一维二叉搜索树K,平地拔起一棵Treap,最广范的应用:用LCA求区间最值,建Treap,还有个什么范围top k我表示并不会查都查不到.它最妙最高的地方在于用栈来 ...

  4. cogs——2478. [HZOI 2016]简单的最近公共祖先

    2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题 ...

  5. cogs 2478. [HZOI 2016]简单的最近公共祖先

    2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题 ...

  6. COGS——T 2478. [HZOI 2016]简单的最近公共祖先

    http://www.cogs.pro/cogs/problem/problem.php?pid=2478 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单 ...

  7. COGS 2199. [HZOI 2016] 活动投票

    2199. [HZOI 2016] 活动投票 ★★   输入文件:hztp.in   输出文件:hztp.out   简单对比时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多, ...

  8. COGS 2485. [HZOI 2016]从零开始的序列

    2485. [HZOI 2016]从零开始的序列 ★★   输入文件:sky_seq.in   输出文件:sky_seq.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] ...

  9. cogs——2419. [HZOI 2016]公路修建2

    2419. [HZOI 2016]公路修建2 ★☆   输入文件:hzoi_road2.in   输出文件:hzoi_road2.out   简单对比时间限制:1 s   内存限制:128 MB [题 ...

随机推荐

  1. mybatis源码解读(二)——构建Configuration对象

    Configuration 对象保存了所有mybatis的配置信息,主要包括: ①. mybatis-configuration.xml 基础配置文件 ②. mapper.xml 映射器配置文件 1. ...

  2. Angular TypeScript开发环境集成jQuery扩展插件

    集成步骤: 1.安装jquery极其扩展插件库ts定义文件 npm install jquery --save npm install --save-dev @types/jquery npm ins ...

  3. c#与webapi交互

    public static string HttpConnectToServer(string ServerPage,string strData) { string postData =strDat ...

  4. 上传本地代码及更新代码到GitHub教程

    上传本地代码及更新代码到GitHub教程 上传本地代码 第一步:去github上创建自己的Repository,创建页面如下图所示: 红框为新建的仓库的https地址 第二步: echo " ...

  5. Spring结合log4j(slf4j)

    maven依赖         <!-- slf4j (级联:log4j/slf4j-api) --> <dependency>         <groupId> ...

  6. 用分支限界法解决人员安排问题(Personnel assignment problem)

    最近考期博主比较忙,先把思路简单说说,图和代码考完试补. 人员安排问题,即给出员工集合和工作集合,寻找最合理的安排. 对于员工集合P,员工集合会依据某个f来给出某种顺序,需要按该顺序P(i)进行工作安 ...

  7. 分析DuxCms之AdminUserModel

    /** * 获取信息 * @param array $where 条件 * @return array 信息 */ public function getWhereInfo($where) { ret ...

  8. JavaScript的数组知识案例之随机点名器

    本次分享JavaScript主要知识点涉及到for循环.if选择结构判断语句.数组的定义.定时器.清除定时器.日期对象的使用. 执行后效果图: 思路: 1.网页结构搭建: HTML 2.网页布局美化: ...

  9. 【转】Sentry介绍

    Sentry 是一个开源的实时错误报告工具,支持 web 前后端.移动应用以及游戏,支持 Python.OC.Java.Go.Node.Django.RoR 等主流编程语言和框架 ,还提供了 GitH ...

  10. Unity3D学习(二):使用JSON进行对象数据的存储读取

    前言 前段时间完成了自己的小游戏Konster的制作,今天重新又看了下代码.原先对关卡解锁数据的存储时用了Unity自带的PlayerPref(字典式存储数据). 读取关卡数据的代码: void Aw ...