正题

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


题目大意

一个空可重集,要求支持

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

但是所有操作都是基于某个历史版本

1≤n≤5×105,1≤∣x∣≤1091\leq n\leq 5\times 10^5,1\leq |x|\leq 10^91≤n≤5×105,1≤∣x∣≤109


解题思路

挺好写的,就是一个FHQFHQFHQ,可持久化部分分裂和主席树差不多,合并和线段树合并差不多。
空间记得开大点。

时空间复杂度都是O(nlog⁡n)O(n\log n)O(nlogn)的。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e7+10;
int n,rt[510000];
struct FHQ{int cnt,w[N],siz[N],rnk[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 Cpy(int x,int y){siz[x]=siz[y];rnk[x]=rnk[y];w[x]=w[y];t[x][0]=t[y][0];t[x][1]=t[y][1];return;}void Split(int &x,int &y,int p,int k){if(!p){x=y=0;return;}int now=++cnt;Cpy(now,p);if(w[p]<=k)x=now,Split(t[now][1],y,t[p][1],k);else y=now,Split(x,t[now][0],t[p][0],k);PushUp(now);return;}int Merge(int x,int y){if(!x||!y)return x|y;int now=++cnt;if(rnk[x]<=rnk[y]){Cpy(now,x);t[now][1]=Merge(t[x][1],y);}else{Cpy(now,y);t[now][0]=Merge(x,t[y][0]);}PushUp(now);return now;}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 &rt,int val){int x,y;Split(x,y,rt,val);rt=Merge(Merge(x,NewNode(val)),y);return;}void Delete(int &rt,int val){int x,y,z;Split(x,z,rt,val);Split(x,y,x,val-1);y=Merge(t[y][0],t[y][1]);rt=Merge(Merge(x,y),z);return;}int GetRank(int rt,int val){int x,y;Split(x,y,rt,val-1);return siz[x]+1;}int GetVal(int rt,int rk){return w[Find(rt,rk)];}int GetPre(int rt,int val){int x,y;Split(x,y,rt,val-1);return w[Find(x,siz[x])];}int GetNxt(int rt,int val){int x,y;Split(x,y,rt,val);return w[Find(y,1)];}
}T;
int main()
{scanf("%d",&n);T.NewNode(-2147483647);T.NewNode(2147483647);rt[0]=T.Merge(1,2);for(int i=1,v,op,x;i<=n;i++){scanf("%d%d%d",&v,&op,&x);rt[i]=rt[v];if(op==1)T.Insert(rt[i],x);else if(op==2)T.Delete(rt[i],x);else if(op==3)printf("%d\n",T.GetRank(rt[i],x)-1);else if(op==4)printf("%d\n",T.GetVal(rt[i],x+1));else if(op==5)printf("%d\n",T.GetPre(rt[i],x));else if(op==6)printf("%d\n",T.GetNxt(rt[i],x));}return 0;
}

P3835-[模板]可持久化平衡树【无旋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. P3369-[模板]普通平衡树【无旋Treap】

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

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

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

  9. luogu P3391 【模板】文艺平衡树(FHQ - treap,懒惰标记)

    整理的算法模板合集: ACM模板 我们把每个查询区间使用solit分裂成[1l−1][lr][r+1n][1~l-1][l~r][r+1~n][1 l−1][l r][r+1 n]三个区间. 再把[l ...

最新文章

  1. 正則表達式,终极使用!3个工具,搞定一切
  2. nedc工况_东南DX3 EV续航升级 NEDC综合工况续航451公里
  3. 目录与文件的权限意义
  4. 电脑常用音频剪辑软件_常用的音频编辑软件
  5. LINUX编译OpenJDK,也可以指定freetype
  6. 论文绘图——矢量图篇
  7. 步数精灵v4.0霸占好友排行榜首位 安卓版
  8. 华为网络设备介绍及基础配置命令
  9. 网络(韩志刚版笔记)
  10. 计算机房属于学校场馆吗,校园常见火灾的预防和逃生安全知识
  11. ubuntu16.04无法调节屏幕亮度
  12. UC浏览器设置代理服务器JAVA_uc浏览器让JAVA手机变“聪明”的方法
  13. 微信支付终于成功了(安卓,iOS),在此分享
  14. 2022年找工作!我建了一个AI算法岗求职群
  15. java 465发送邮件_465端口发送邮件失败
  16. 在web.xml中配置多个param-value
  17. JavaScript+Css+Html实现网页换皮肤功能
  18. 如何在Outlook中单击邮件后立即将其标记为已读
  19. element-ui input组件源码分析整理笔记(六)
  20. 中文编程软件 习佳佳 1.82 版 介绍

热门文章

  1. js获取int类型长度_js代码比较大小前需要把string转换int
  2. 一键对频对讲机好吗_对讲机的基础知识你都知道多少呢?
  3. c语言输入一个数存数组,//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个...
  4. oracle 如何筛选重复,求sql--筛选A字段相同,B字段不同且不重复的记录
  5. linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]
  6. python自动化测试脚本怎么编写_编写自动化测试脚本心得---菜鸟入门篇
  7. mysql查询重复的名字_Mysql中like用法:查询名字中含有风字的学生信息
  8. quill变html转化,将Quill Delta转换为HTML
  9. leetcode134. 加油站
  10. 151. 翻转字符串里的单词(思路+详解)