Splay 均摊复杂度证明见此处 \(\rightarrow\) 链接

代码如下

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+10;
  4. const int inf=0x3f3f3f3f;
  5. struct node{
  6. #define ls(x) t[x].ch[0]
  7. #define rs(x) t[x].ch[1]
  8. int fa,ch[2],val,size,cnt;
  9. }t[maxn];
  10. int tot,root;
  11. inline int get(int x){return x==rs(t[x].fa);}
  12. inline void pushup(int x){
  13. t[x].size=t[ls(x)].size+t[rs(x)].size+t[x].cnt;
  14. }
  15. inline int find(int val){
  16. int x=root;
  17. while(t[x].val!=val&&t[x].ch[t[x].val<val])x=t[x].ch[t[x].val<val];
  18. return x;
  19. }
  20. inline void rotate(int x){
  21. int fa=t[x].fa,gfa=t[fa].fa;
  22. int d1=get(x),d2=get(fa);
  23. t[fa].ch[d1]=t[x].ch[d1^1],t[t[x].ch[d1^1]].fa=fa;
  24. t[x].ch[d1^1]=fa,t[fa].fa=x;
  25. t[x].fa=gfa,t[gfa].ch[d2]=x;
  26. pushup(fa),pushup(x);
  27. }
  28. inline void splay(int x,int goal){
  29. while(t[x].fa!=goal){
  30. int fa=t[x].fa,gfa=t[fa].fa;
  31. if(gfa!=goal)get(x)==get(fa)?rotate(fa):rotate(x);
  32. rotate(x);
  33. }
  34. if(!goal)root=x;
  35. }
  36. void insert(int val){
  37. int x=root,fa=0;
  38. while(x&&t[x].val!=val)fa=x,x=t[x].ch[t[x].val<val];
  39. if(x)++t[x].cnt;
  40. else{
  41. x=++tot;
  42. if(fa)t[fa].ch[t[fa].val<val]=x;
  43. t[x].fa=fa,t[x].val=val,t[x].cnt=t[x].size=1;
  44. }
  45. splay(x,0);
  46. }
  47. int kth(int x,int k){
  48. if(k<=t[ls(x)].size)return kth(ls(x),k);
  49. else if(k>t[ls(x)].size+t[x].cnt)return kth(rs(x),k-t[ls(x)].size-t[x].cnt);
  50. else return t[x].val;
  51. }
  52. int getrank(int val){
  53. splay(find(val),0);
  54. return t[ls(root)].size;
  55. }
  56. int getpre(int val){
  57. splay(find(val),0);
  58. if(t[root].val<val)return root;
  59. int x=ls(root);
  60. while(rs(x))x=rs(x);
  61. return x;
  62. }
  63. int getnxt(int val){
  64. splay(find(val),0);
  65. if(t[root].val>val)return root;
  66. int x=rs(root);
  67. while(ls(x))x=ls(x);
  68. return x;
  69. }
  70. void remove(int val){
  71. int pre=getpre(val),nxt=getnxt(val);
  72. splay(pre,0),splay(nxt,pre);
  73. if(t[ls(nxt)].cnt>1)--t[ls(nxt)].cnt,splay(ls(nxt),0);
  74. else ls(nxt)=0,splay(nxt,0);
  75. }
  76. void initial(){insert(-inf),insert(inf);}
  77. int main(){
  78. initial();
  79. int opt,val,n;
  80. scanf("%d",&n);
  81. while(n--){
  82. scanf("%d%d",&opt,&val);
  83. switch(opt){
  84. case 1:insert(val);break;
  85. case 2:remove(val);break;
  86. case 3:printf("%d\n",getrank(val));break;
  87. case 4:printf("%d\n",kth(root,val+1));break;
  88. case 5:printf("%d\n",t[getpre(val)].val);break;
  89. case 6:printf("%d\n",t[getnxt(val)].val);break;
  90. }
  91. }
  92. return 0;
  93. }

【模板】Splay的更多相关文章

  1. 算法模板——splay区间反转 2

    实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没 ...

  2. 算法模板——splay区间反转 1

    实现的功能:将序列区间反转,并维护 详见BZOJ3223 var i,j,k,l,m,n,head,a1,a2:longint; s1:ansistring; a,b,c,d,fat,lef,rig: ...

  3. 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay

    题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...

  4. 洛谷 P3391 模板Splay

    #include<bits/stdc++.h> using namespace std; #define maxn 200000 int read() { ,w=; ;ch=getchar ...

  5. [模板] Splay

    欠了好久的Splay,以后就它了. 默写真不容易,过几天估计就忘了.. 整个Splay真的精妙,不拖泥带水那种.. 前驱后继之所以不能用rk转到根,是因为这个数不一定存在.. kth中<=老忘记 ...

  6. 模板—splay

    #include<iostream> #include<cstdio> #define cin(x) scanf("%d",&x) using na ...

  7. 模板——Splay

    $Splay$ #include <bits/stdc++.h> #define inf (int)1e9 using namespace std; const int N=1e5+100 ...

  8. Splay 伸展树

    废话不说,有篇论文可供参考:杨思雨:<伸展树的基本操作与应用> Splay的好处可以快速分裂和合并. ===============================14.07.26更新== ...

  9. [NOI2003][bzoj1507] 文本编辑器 editor [splay]

    其实看明白了就是一道水题 毕竟模板 splay敲一发,插入一个串的时候先把它构建成一棵平衡树,再挂到原来的splay上面去即可 没别的了,上代码 #include<iostream> #i ...

  10. splay最终模板

    来自wjmzbmr的splay模板 #include<cstdio> #include<iostream> #include<algorithm> using na ...

随机推荐

  1. 解决 webpack-dev-server 不能自动刷新的问题

    原文发表于我的技术博客 此文主要帮助大家解决 webpack-dev-server 启动后修改源文件浏览器不能自动刷新的问题. 原文发表于我的技术博客 1. webpack 不能热加载的问题 主要的问 ...

  2. Mysql主从同步(1) - 概念和原理介绍 以及 主从/主主模式 部署记录

    Mysql复制概念Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一 ...

  3. mysql操作命令梳理(4)-grant授权和revoke回收权限

    在mysql维护工作中,做好权限管理是一个很重要的环节.下面对mysql权限操作进行梳理: mysql的权限命令是grant,权限撤销的命令时revoke:grant授权格式:grant 权限列表 o ...

  4. 使用requests库提交multipart/form-data 格式的请求

    前言: Requests是用Python语言编写,基于urllib,采用Apache2 Licensed开源协议的HTTP库.它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求 ...

  5. 《Linux内核设计与实现》 第一二章学习笔记

    <Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...

  6. mapreduce 中 map数量与文件大小的关系

    学习mapreduce过程中, map第一个阶段是从hdfs 中获取文件的并进行切片,我自己在好奇map的启动的数量和文件的大小有什么关系,进过学习得知map的数量和文件切片的数量有关系,那文件的大小 ...

  7. QT 窗口置顶功能

    Qt中,保持窗口置顶的设置为: Qt::WindowFlags m_flags = windowFlags(); setWindowFlags(m_flags | Qt::WindowStaysOnT ...

  8. maven上传本地jar包到私服

    场景 1. 本地jar包上传到私服 思路: 1. maven的settting.xml配置私服的帐号密码 2. pom.xml配置上传的地址 3. 执行 mvn deploy 部署jar包到私服 步骤 ...

  9. Qt__CMakeLists.txt

    cmake_minimum_required(VERSION 3.1.0) project (Project) if(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_CXX_FL ...

  10. Layui_HDFS目录(上传,下载,删除,分页,下级目录,键盘控制返回上一页)

    注:转载请署名 一.实体 package com.ebd.application.modules.fileManage.pojo; public class FilesOrDirs { private ...