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 [题 ...
随机推荐
- 关于期权池Option Pools与Vesting:码农创业防身必备法器
之前又看到饿了么创始人团队纠纷的几篇文章,参考了百科.wiki.36Kr.虎嗅.知乎以及邵亦波老师的文章,对之前一直感兴趣的期权汇编初略总结了下 ,仍觉粗糙,对一些具体操作还是不甚了了,不过感觉在中国 ...
- Socket.io文字直播聊天室的简单代码
直接上代码吧,被注释掉的主要是调试代码,和技术选型的测试代码 var app = require('express')(); var server = require('http').Server(a ...
- PHP实现zip压缩打包下载
先来看PHP实现文件及文件夹的zip压缩 这里使用PHP扩展的ZipArchive类,在使用之前要将php.ini文件中的zlib.output_compression设置为On 代码如下: publ ...
- springboot中使用分页,文件上传,jquery的具体步骤(持续更新)
分页: pom.xml 加依赖 <dependency> <groupId>com.github.pagehelper</groupId> <arti ...
- Ext Js Sencha Cmd 命令 打包charts
先进入charts包的目录下 cd D:\开发文档API\ext--gpl\packages\charts 在执行打包命令 sencha package build
- UE4中如何使物体始终朝向摄像头?
要使物体始终正面朝向摄像头需要用到一个关键节点:Find Look at Rotation 其中Start连接需要旋转的物体位置矢量,Target连接摄像头位置矢量 最后设置SetActorRotat ...
- Beta 冲刺day2
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天主要是在确认需求方面花了一些时间,后来终于确认了企业自查风险模块的需求问题 今天解决的进度:根据昨天确认下来的需求,我们基本上完成了 ...
- window.open打开新窗体并用post方式传参
function openPostWindow(url,data,name){ //url要跳转到的页面,data要传递的数据,name显示方式(可能任意命名) var tempForm = docu ...
- 转)ZooKeeper的实现分析
最近在大量看关于Zookeeper的博客,发现一篇讲解ZK实现很详细的博客,特此转载一下: 原博客地址: http://my.oschina.net/zhengyang841117/blog/1866 ...
- PHP之cookies小练习
//5-1.php 1 <? error_reporting(E_ALL ^ E_NOTICE); if ($_COOKIE['username']!="") { echo ...