COGS2421 [HZOI 2016]简单的Treap
大概是个模板题
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的更多相关文章
- [补档][HZOI 2016]简单的Treap
[HZOI 2016]简单的Treap 题目 Treap是一种平衡二叉搜索树,除二叉搜索树的基本性质外,Treap还满足一个性质: 每个节点都有一个确定的优先级,且每个节点的优先级都比它的两个儿子小( ...
- COGS 2421.[HZOI 2016]简单的Treap 题解
题目大意: 给定n个数及其优先级,求对应的符合最小堆性质的Treap的先序遍历. n<=500000. 解法: 目前为止我只想到了三种解法,其中第三种是正解. 1.暴力1 以优先级为关键字排序, ...
- [COGS 2421] [HZOI 2016] 简单的Treap 笛卡尔树
笛卡尔树就是你给两维限制,一维堆R,一维二叉搜索树K,平地拔起一棵Treap,最广范的应用:用LCA求区间最值,建Treap,还有个什么范围top k我表示并不会查都查不到.它最妙最高的地方在于用栈来 ...
- cogs——2478. [HZOI 2016]简单的最近公共祖先
2478. [HZOI 2016]简单的最近公共祖先 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单对比时间限制:2 s 内存限制:128 MB [题 ...
- cogs 2478. [HZOI 2016]简单的最近公共祖先
2478. [HZOI 2016]简单的最近公共祖先 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单对比时间限制:2 s 内存限制:128 MB [题 ...
- COGS——T 2478. [HZOI 2016]简单的最近公共祖先
http://www.cogs.pro/cogs/problem/problem.php?pid=2478 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单 ...
- COGS 2199. [HZOI 2016] 活动投票
2199. [HZOI 2016] 活动投票 ★★ 输入文件:hztp.in 输出文件:hztp.out 简单对比时间限制:0.5 s 内存限制:2 MB [题目描述] 衡中活动很多, ...
- COGS 2485. [HZOI 2016]从零开始的序列
2485. [HZOI 2016]从零开始的序列 ★★ 输入文件:sky_seq.in 输出文件:sky_seq.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] ...
- cogs——2419. [HZOI 2016]公路修建2
2419. [HZOI 2016]公路修建2 ★☆ 输入文件:hzoi_road2.in 输出文件:hzoi_road2.out 简单对比时间限制:1 s 内存限制:128 MB [题 ...
随机推荐
- 自动生成MyEclipse 安装破解码
新建一个class 文件,Debug 模式运行一个,输入任意值 ,回车得到破解安装码 代码文件如下: import java.io.*; public class MyEclipseGen { pri ...
- Windows10上搭建Kinect 2 开发环境
因为Visual Studio 2017的应用最低只能面向windows10,而Kinect SDK 2.0的系统版本要求是windows 8,所以不得不下载Visual Studio 2013 co ...
- IsNullOrEmpty与IsNullOrWhiteSpace性能比较
IsNullOrEmpty与IsNullOrWhiteSpace性能谁比较高呢? 在string都是空字符串的情况下: IsNullOrWhiteSpace要比IsNullOrEmpty快大约 1~5 ...
- 导入项目 idea
下的java核心编程的源码,只有java文件,没有idea或者eclipse的项目结构信息. 分别用eclipse和idea打开了一遍,方便学习调试. 项目文件夹:E:\学习资料\Java\语法\ja ...
- EF Linq中的左连接Left Join查询
linq中的join是inner join内连接,就是当两个表中有一个表对应的数据没有的时候那个关联就不成立. 比如表A B的数据如下 from a in A join b in B on a.BId ...
- (三)SpringBoot基础篇- 持久层,jdbcTemplate和JpaRespository
一.介绍 SpringBoot框架为使用SQL数据库提供了广泛的支持,从使用JdbcTemplate的直接JDBC访问到完整的"对象关系映射"技术(如Hibernate).Spri ...
- Surface pro 4 使用心得
今天谈谈这几个月Surface pro 4的使用心得.这篇后面有点跑题,行文也比较随意,就当闲笔了. 设备简述 使用体验 优点 不足 优雅使用 系统界面 应用 系统应用 工具应用 生产工具 其他应用 ...
- Page.ClientScript.RegisterStartupScript用法小结
使用类型.键.脚本文本和指示是否添加脚本标记的布尔值向 Page 对象注册启动脚本. 参数 type 要注册的启动脚本的类型. key 要注册的启动脚本的键. script 要注册的启动脚本文本. a ...
- 1、原生javascript方法小汇
Js 对象 使用new 关键字来创建对象,举例如下, var a = new String();如构造函数无参数,则不必加括号, JS内部对象数组(Array)对象创建数组var myarray = ...
- Python_回调函数
import os import stat def remove_readonly(func,path): #定义回调函数 os.chmod(path,stat.S_IWRITE) #删除文件的只读文 ...