【bzoj3224】普通平衡树——treap
我的第一道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相关推荐
- 信息学奥赛一本通 提高篇 第6章 平衡树Treap
随笔分类 - 动态规划--树形动态规划 动态规划--树形动态规划 - 随笔分类 - 符拉迪沃斯托克 - 博客园 平衡树 Treap 平衡树_百度百科 平衡树--treap - genius777 - ...
- 平衡树-Treap基础内容
平衡树-Treap 2021年8月6日 什么是平衡树? 平衡树是指任意节点左右子树高度差都小于等于1的二叉树. 平衡树干什么? 平衡树对序列的排序,寻找元素的位置有很方便的操作 算法原理 建树 Tre ...
- 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...
- 【数据结构】平衡树 - treap
treap = tree + heap 树堆(treap:让BST尽量随机) 动态维护一个有序序列 对于一个大根堆: 最大值:一直往右走 最小值:一直往左走 treap实现操作 set实现 ①插入 i ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 3224 普通平衡树 treap or vector
很明显这是一道treap的题,但看了黄学长的博客后,也让我大开了眼界,没想到vector也能用那么短的编码量把这道题AC,着实令我敬佩.这也提醒了我 STL 的重要性. 的确, 对于C++ 选手来说, ...
- 数据结构之平衡树(Treap)
平衡树是二叉搜索树和堆合并构成的新数据结构,所以它的名字取了Tree和Heap各一半,叫做Treap. 堆和树的性质是冲突的,二叉搜索树满足左子树<根节点<右子树,而堆是满足根节点小于等于 ...
- 平衡树 - treap
整理的算法模板合集: ACM模板 operator 1 : 插入一个数 operator 2 : 删除一个数 operator 3 : 通过数值找排名 operator 4 : 通过排名找数值 ope ...
- BZOJ3224普通平衡树
洛谷题面链接 很早就过了,太久没打了,原本是在noip前用来练emacs的手感的. noip炸了,就滚回来更博客了(安排的计数任务刷不动,学不会容斥,打发时间...) 众所周知,splay是个好算法, ...
最新文章
- 认识Java Core和Heap Dump
- excel另存为没有dbf_PDF转Excel怎么做的?节省工作时间,你要学会的办公技巧
- 一句话评论设计模式六大原则--转
- Win10安装玩Ubuntu19.04后,bios和grub页面都没有Windows启动项,无法进入Windows
- linux命令全集,Linux命令全集
- (time.h) 自己用
- android获取apk名称_安卓逆向——APK安装流程
- 人工智能、机器学习和深度学习的区别?
- 回归树与基于规则的模型(part3)--回归模型树
- 【阿里内部应用】基于Blink为新商业调控打造实时大数据交互查询服务
- 设备I/O之OVERLAPPED
- 使用pip安装virtualenv时出现问题
- magisk安装失败_MIUI eu版安装刷入教程
- 将Windows8或WindowsServer2012装在VHD上
- 付费音乐如何下载???
- H5 移动端浏览器调用微信的分享功能
- SQL中的升序和降序
- 点击劫持(clickjacking)
- leetcode刷题(第739题)——每日温度
- openresty ngx_lua请求响应
热门文章
- Linux 驱动开发之内核模块开发(四)—— 符号表的导出
- 用实例分析H264 RTP payload
- 工作405-关于vue组件开发过程中一直报错:This relative module was not found:
- [html] 404页面有什么作用?
- [html] 如何在IOS下启用WebApp全屏模式?
- PS教程第二十三课:套索工具
- 工作383:css使absolute相对于父容器进行定位而不是以body(为什么绝对定位(absolute)的父级元素必须是相对定位(relative))...
- [vue] 什么是虚拟DOM?
- 前端学习(2604):增加响应头可以获取数据
- 前端学习(2595):后台系统的权限控制和管理--动态路由