我的第一道treap题目,treap的模版题。

代码是对着hzw的敲的,一边敲一边理解。。。

主要是熟悉一下treap的各种基本操作,详细细节看代码。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
struct point
{int l,r,v,rnd,size,w;
}tree[100005];
int n,size=0,root=0,ans;
void update(int k)
{tree[k].size=tree[tree[k].l].size+tree[tree[k].r].size+tree[k].w;
}
void rturn(int &t)
{int k=tree[t].l;tree[t].l=tree[k].r;tree[k].r=t;tree[k].size=tree[t].size;update(t);t=k;
}
void lturn(int &t)
{int k=tree[t].r;tree[t].r=tree[k].l;tree[k].l=t;tree[k].size=tree[t].size;update(t);t=k;
}
void insert(int &k,int x)
{if(k==0){size++;k=size;tree[k].size=tree[k].w=1;tree[k].v=x;tree[k].rnd=rand();return;}tree[k].size++;if(tree[k].v==x)tree[k].w++;else if(x>tree[k].v){insert(tree[k].r,x);if(tree[tree[k].r].rnd<tree[k].rnd)lturn(k);}else {insert(tree[k].l,x);if(tree[tree[k].l].rnd<tree[k].rnd)rturn(k);}
}
void del(int &k,int x)
{if(k==0)return ;if(tree[k].v==x){if(tree[k].w>1){tree[k].w--;tree[k].size--;return;}if(tree[k].l*tree[k].r==0)k=tree[k].l+tree[k].r;else if(tree[tree[k].l].rnd<tree[tree[k].r].rnd)rturn(k),del(k,x);else lturn(k),del(k,x);}else if(x>tree[k].v)tree[k].size--,del(tree[k].r,x);else tree[k].size--,del(tree[k].l,x);
}
int get_rank(int k,int x)
{if(k==0)return 0;if(tree[k].v==x)return tree[tree[k].l].size+1;else if(tree[k].v<x)return tree[tree[k].l].size+tree[k].w+get_rank(tree[k].r,x);else return get_rank(tree[k].l,x);
}
int get_x(int k,int x)
{if(k==0)return 0;if(x<=tree[tree[k].l].size)return get_x(tree[k].l,x);else if(x>tree[tree[k].l].size+tree[k].w)return get_x(tree[k].r,x-tree[tree[k].l].size-tree[k].w);else return tree[k].v;
}
void get_big(int k,int x)
{if(k==0)return;if(tree[k].v<x){ans=k;get_big(tree[k].r,x);}else get_big(tree[k].l,x);
}
void get_small(int k,int x)
{if(k==0)return ;if(tree[k].v>x){ans=k;get_small(tree[k].l,x);}else get_small(tree[k].r,x);
}
int main()
{scanf("%d",&n);int opt,x;for(int i=1;i<=n;i++){scanf("%d %d",&opt,&x);switch(opt){case 1:insert(root,x);break;case 2:del(root,x);break;case 3:printf("%d\n",get_rank(root,x));break;case 4:printf("%d\n",get_x(root,x));break;case 5:ans=0;get_big(root,x);printf("%d\n",tree[ans].v);break;case 6:ans=0;get_small(root,x);printf("%d\n",tree[ans].v);break;}}return 0;
}

万分感谢黄学长啊啊啊啊

转载于:https://www.cnblogs.com/JKAI/p/6935265.html

【bzoj3224】普通平衡树——treap相关推荐

  1. 信息学奥赛一本通 提高篇 第6章 平衡树Treap

    随笔分类 - 动态规划--树形动态规划 动态规划--树形动态规划 - 随笔分类 - 符拉迪沃斯托克 - 博客园 平衡树 Treap 平衡树_百度百科 平衡树--treap - genius777 - ...

  2. 平衡树-Treap基础内容

    平衡树-Treap 2021年8月6日 什么是平衡树? 平衡树是指任意节点左右子树高度差都小于等于1的二叉树. 平衡树干什么? 平衡树对序列的排序,寻找元素的位置有很方便的操作 算法原理 建树 Tre ...

  3. 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...

  4. 【数据结构】平衡树 - treap

    treap = tree + heap 树堆(treap:让BST尽量随机) 动态维护一个有序序列 对于一个大根堆: 最大值:一直往右走 最小值:一直往左走 treap实现操作 set实现 ①插入 i ...

  5. BZOJ 3224: Tyvj 1728 普通平衡树 treap

    3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  6. BZOJ 3224 普通平衡树 treap or vector

    很明显这是一道treap的题,但看了黄学长的博客后,也让我大开了眼界,没想到vector也能用那么短的编码量把这道题AC,着实令我敬佩.这也提醒了我 STL 的重要性. 的确, 对于C++ 选手来说, ...

  7. 数据结构之平衡树(Treap)

    平衡树是二叉搜索树和堆合并构成的新数据结构,所以它的名字取了Tree和Heap各一半,叫做Treap. 堆和树的性质是冲突的,二叉搜索树满足左子树<根节点<右子树,而堆是满足根节点小于等于 ...

  8. 平衡树 - treap

    整理的算法模板合集: ACM模板 operator 1 : 插入一个数 operator 2 : 删除一个数 operator 3 : 通过数值找排名 operator 4 : 通过排名找数值 ope ...

  9. BZOJ3224普通平衡树

    洛谷题面链接 很早就过了,太久没打了,原本是在noip前用来练emacs的手感的. noip炸了,就滚回来更博客了(安排的计数任务刷不动,学不会容斥,打发时间...) 众所周知,splay是个好算法, ...

最新文章

  1. 认识Java Core和Heap Dump
  2. excel另存为没有dbf_PDF转Excel怎么做的?节省工作时间,你要学会的办公技巧
  3. 一句话评论设计模式六大原则--转
  4. Win10安装玩Ubuntu19.04后,bios和grub页面都没有Windows启动项,无法进入Windows
  5. linux命令全集,Linux命令全集
  6. (time.h) 自己用
  7. android获取apk名称_安卓逆向——APK安装流程
  8. 人工智能、机器学习和深度学习的区别?
  9. 回归树与基于规则的模型(part3)--回归模型树
  10. 【阿里内部应用】基于Blink为新商业调控打造实时大数据交互查询服务
  11. 设备I/O之OVERLAPPED
  12. 使用pip安装virtualenv时出现问题
  13. magisk安装失败_MIUI eu版安装刷入教程
  14. 将Windows8或WindowsServer2012装在VHD上
  15. 付费音乐如何下载???
  16. H5 移动端浏览器调用微信的分享功能
  17. SQL中的升序和降序
  18. 点击劫持(clickjacking)
  19. leetcode刷题(第739题)——每日温度
  20. openresty ngx_lua请求响应

热门文章

  1. Linux 驱动开发之内核模块开发(四)—— 符号表的导出
  2. 用实例分析H264 RTP payload
  3. 工作405-关于vue组件开发过程中一直报错:This relative module was not found:
  4. [html] 404页面有什么作用?
  5. [html] 如何在IOS下启用WebApp全屏模式?
  6. PS教程第二十三课:套索工具
  7. 工作383:css使absolute相对于父容器进行定位而不是以body(为什么绝对定位(absolute)的父级元素必须是相对定位(relative))...
  8. [vue] 什么是虚拟DOM?
  9. 前端学习(2604):增加响应头可以获取数据
  10. 前端学习(2595):后台系统的权限控制和管理--动态路由