正题

题目链接:https://www.luogu.com.cn/problem/P3369


题目大意

一个空可重集,要求支持

  • 插入一个数xxx
  • 删除一个数xxx
  • 询问一个数xxx的排名
  • 询问排名第xxx的数字
  • 询问xxx的前驱
  • 询问xxx的后继

1≤n≤105,1≤∣x∣≤1071\leq n\leq 10^5,1\leq |x|\leq 10^71≤n≤105,1≤∣x∣≤107


解题思路

拖了两年的FHQ终于还是写了(还有二逼平衡树拖到现在还没写)。

看的是别人博客学的:https://www.luogu.com.cn/blog/85514/fhq-treap-xue-xi-bi-ji

具体特点就是结构固定我通过分裂的方式直接让节点插入在对应的位置,这样就不需要旋转来调整结构了。

还有相同的数字不是存在同一个节点而是分开存的,所以同一个数字可以有多个节点。

时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int T,root;
struct FHQ{int cnt,w[N],rnk[N],siz[N],t[N][2];int NewNode(int val){w[++cnt]=val;siz[cnt]=1;rnk[cnt]=rand();return cnt;}void PushUp(int x){siz[x]=siz[t[x][0]]+siz[t[x][1]]+1;return;}void Split(int &x,int &y,int p,int val){if(!p){x=y=0;return;}if(w[p]<=val)x=p,Split(t[x][1],y,t[p][1],val);else y=p,Split(x,t[y][0],t[p][0],val);PushUp(p);return;}int Merge(int x,int y){if(!x||!y)return x|y;if(rnk[x]<rnk[y]){t[x][1]=Merge(t[x][1],y);PushUp(x);return x;}else{t[y][0]=Merge(x,t[y][0]);PushUp(y);return y;}}int Find(int x,int k){if(siz[t[x][0]]>=k)return Find(t[x][0],k);if(siz[t[x][0]]+1==k)return x;return Find(t[x][1],k-siz[t[x][0]]-1);}void Insert(int w){int x,y;Split(x,y,root,w);root=Merge(Merge(x,NewNode(w)),y);}void Delete(int w){int x,y,z;Split(x,y,root,w-1);Split(y,z,y,w);y=Merge(t[y][0],t[y][1]);root=Merge(Merge(x,y),z);return;}int GetRank(int w){int x,y,ans;Split(x,y,root,w-1);ans=siz[x]+1;root=Merge(x,y);return ans;}int GetVal(int r){return w[Find(root,r)];}int GetPre(int r){int x,y,ans;Split(x,y,root,r-1);ans=w[Find(x,siz[x])];root=Merge(x,y);return ans;}int GetNxt(int r){int x,y,ans;Split(x,y,root,r);ans=w[Find(y,1)];root=Merge(x,y);return ans;}
}Tr;
int main()
{scanf("%d",&T);Tr.NewNode(-1e9);Tr.NewNode(1e9);root=Tr.Merge(1,2);while(T--){int op,w;scanf("%d%d",&op,&w);if(op==1)Tr.Insert(w);else if(op==2)Tr.Delete(w);else if(op==3)printf("%d\n",Tr.GetRank(w)-1);else if(op==4)printf("%d\n",Tr.GetVal(w+1));else if(op==5)printf("%d\n",Tr.GetPre(w));else if(op==6)printf("%d\n",Tr.GetNxt(w));}
}

P3369-[模板]普通平衡树【无旋Treap】相关推荐

  1. 浅尝无旋Treap (基于洛谷P3391 文艺平衡树)

    说是浅尝吧,确实也挺浅的,完全是基于下面这道题写的↓ 洛谷P3391 自己去看题,我是懒得粘了... 分析 其实也没有什么好分析的,这就是一道Splay树的模板题,解决一般的Treap不能解决的区间维 ...

  2. 无旋treap的简单思想以及模板

    因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...

  3. 模板:无旋treap

    文章目录 前言 操作 合并 分裂 插入 删除 查找第k大 查询x的排名 前驱后继 完整代码 所谓无旋treap,就是不带旋转的treap 前言 现在"理论上"我会四种平衡树了 之前 ...

  4. luogu P2596 [ZJOI2006]书架(平衡树、无旋treap(按排名分裂)一些更复杂的操作)

    P2596 [ZJOI2006]书架 无旋treap可以维护一棵树的中序遍历结果.但是不支持通过编号来找节点.于是在无旋treap的基础上,我维护了每个节点的父亲,这样就可以求出一个节点是中序遍历中的 ...

  5. 无旋treap 文艺平衡树

    因为需要用到区间修改,所以该用splay(尚未填坑)或者无旋treap(刚刚填上) 最开始的建树用到了建笛卡尔树的方法,把id大于当前点的点不断出栈,又因为这道题的点是按序入栈的,所以当它无法让更多点 ...

  6. BST、AVL、BTree、B+Tree、B*Tree、23Tree、234Tree、TTree、RBTree、LLRBTree、AATree、SplayTree、Treap、无旋Treap、scap

    喜欢这篇文章吗?喜欢的话去看博主的置顶博客,即可依据分类找到此文章的原版得到更好的体验, 图片及代码显示的问题,笔者深感抱歉,想要更好的体验去原博文即可. title: tree mathjax: t ...

  7. luogu P3850 [TJOI2007]书架(平衡树、无旋treap(按排名分裂))

    luogu P3850 [TJOI2007]书架 这里要的是字符串,所以我们最好用一个map映射一下,不要在结构体中用string代替val. fhq-treap中所有的排名实际上都指的是前面有多少个 ...

  8. P3835-[模板]可持久化平衡树【无旋Treap】

    正题 题目链接:https://www.luogu.com.cn/problem/P3835 题目大意 一个空可重集,要求支持 插入一个数xxx 删除一个数xxx 询问一个数xxx的排名 询问排名第x ...

  9. 无旋Treap(fhq)

    一.Treap的性质 Treap就是集BST.Heap二者的性质于一身,即能够支持BST的操作,有能够保证Heap的深度.但BST和Heap的性质似乎有些矛盾,前者是左子树<根<右子树,后 ...

最新文章

  1. 如何用Asp判断你的网站的虚拟物理路径
  2. 反垄断审查坚持一视同仁 光伏出口下滑源于欧盟政策
  3. js怎么获取访问页数记录(知道的能不能告诉我一下)
  4. Ubuntu16.04 安装chromedriver
  5. 七年程序员生涯,我学到的重要六课
  6. Visual Basic 15语言新特性
  7. 咖啡口味介绍及存储方式
  8. Python使用matplotlib模块绘制多条折线图、散点图
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_11_Thread类的常用方法_sleep...
  10. 菜鸟之路---1,熊猫烧香病毒的简单分析
  11. excel表转成PDF文档
  12. Caused by: org.hibernate.AssertionFailure: Subclass has to be binded after it's mother class:
  13. c语言程序填空题库,c语言填空题题库
  14. 数学建模笔记——评价类模型(二)
  15. 搅拌摩擦焊有限元仿真分析学习笔记
  16. C语言中 || \ 符号的意思
  17. 欧拉角、万向节死锁理解
  18. MarkDown 图片和链接
  19. 【图文并茂】Win7在线一键重装系统教程
  20. 数据结构实验_大学数据统计

热门文章

  1. mysql 前缀索引 语法_PHP 之Mysql优化
  2. bread是可数还是不可数_雅思官方语法教程之——这个名词到底可不可数?
  3. 微型计算机c560,2010广东省计算机等级考试试题 二级C试题最新考试试题库
  4. linux查看mq是否启动的命令,rocketmq查看命令
  5. leetcode53. 最大子数组和(暴力+贪心)
  6. 算法-排序-归并排序
  7. word List 24
  8. Java ArrayList的实现原理详解
  9. P3591 [POI2015]ODW(分块)
  10. Wannafly挑战赛24 无限手套(生成函数)