博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[COGS 2421] [HZOI 2016] 简单的Treap 笛卡尔树
阅读量:4687 次
发布时间:2019-06-09

本文共 1219 字,大约阅读时间需要 4 分钟。

笛卡尔树就是你给两维限制,一维堆R,一维二叉搜索树K,平地拔起一棵Treap,最广范的应用:用LCA求区间最值,建Treap,还有个什么范围top k我表示并不会查都查不到。它最妙最高的地方在于用栈来建树:我们可以先排序K然后一个个插入,那么我们都是最右端,横容易被卡,那么我们不从上到下,我们从下到上,用栈维护,那就把时间复杂度从O(n^2)降到O(n),具体过程见下图从图一到图二就是这么一个过程,我们在把K为13的点插入时要找到一个合适的位置,上比他大,下比他小(假设大根堆)

下面见代码

#include
#include
#define MAXN 500010using namespace std;inline int read(){ int sum=0; char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9') { sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar(); } return sum;}struct Treap{ int key,r; Treap *ch[2];}*stack[MAXN],node[MAXN],*root;int top;int n;int comp(const Treap a,const Treap b){ return a.key
r>node[i].r) last=stack[top--]; if(top)stack[top]->ch[1]=node+i; node[i].ch[0]=last; stack[++top]=node+i; } root=stack[1];}void dfs(Treap *p){ if(!p)return; printf("%d ",p->key); dfs(p->ch[0]); dfs(p->ch[1]);}int main(){ int __size__=128<<20; char *__p__=(char*)malloc(__size__)+__size__; __asm__("movl %0, %%esp\n"::"r"(__p__)); freopen("treap.in","r",stdin); freopen("treap.out","w",stdout); Init(); Build(); dfs(root); return 0;}

 

转载于:https://www.cnblogs.com/TSHugh/p/7242090.html

你可能感兴趣的文章
vim代码格式化插件clang-format
查看>>
RTP Payload Format for Transport of MPEG-4 Elementary Streams over http
查看>>
Java环境变量设置
查看>>
【JBPM4】判断节点decision 方法3 handler
查看>>
filter 过滤器(监听)
查看>>
node启动时, listen EADDRINUSE 报错;
查看>>
杭电3466————DP之01背包(对状态转移方程的更新理解)
查看>>
kafka中的消费组
查看>>
python--注释
查看>>
SQL case when else
查看>>
MVc Identity登陆锁定
查看>>
cdn连接失败是什么意思_关于CDN的原理、术语和应用场景那些事
查看>>
ultraedit26 运行的是试用模式_免费试用U盘数据恢复工具 – 轻松找回U盘丢失的各种数据!...
查看>>
python sum函数导入list_python sum函数iterable参数为二维list,start参数为“[]”该如何理解...
查看>>
UVa540 Team Queue
查看>>
android 练习之路 (八)
查看>>
tp5 中 model 的聚合查询
查看>>
android wear开发之:增加可穿戴设备功能到通知中 - Adding Wearable Features to Notifications...
查看>>
压缩文件函数库(转载)
查看>>
【转】ubuntu12.04没有/var/log/messages解决
查看>>