正题

评测记录:https://www.luogu.org/recordnew/lists?uid=SSL_WYC_zombieeeeee&pid=P3369&status=&sort=0


题目大意

要求支持查询一个数字的排名,查询该排名的数字,插入数字,删除数字,求前驱后继。


解题思路

Splay不解释。


codecodecode

#include<cstdio>
#include<algorithm>
#define INF 2100000000
#define N 100010
using namespace std;
struct splay{int v[N],father[N];int l[N],r[N];int sum[N],recy[N];int n,points;#define root r[0]void Updata(int x){sum[x]=sum[l[x]]+sum[r[x]]+recy[x];}int Identify(int x){return l[father[x]]==x?0:1;}void Connect(int x,int f,int son){father[x]=f;if(son) r[f]=x;else l[f]=x;}void Rotate(int x){int y=father[x];int mroot=father[y];int mrootson=Identify(y);int yson=Identify(x);int B=(yson?l[x]:r[x]);Connect(B,y,yson);Connect(y,x,(yson^1));Connect(x,mroot,mrootson);Updata(y);Updata(x);}void Splay(int at,int to){to=father[to];while(father[at]!=to){int up=father[at];if(father[up]==to) Rotate(at);else if(Identify(up)==Identify(at)){Rotate(up);Rotate(at);}else{Rotate(at);Rotate(at);}}}int CrePoint(int vs,int fathers){n++;v[n]=vs;father[n]=fathers;sum[n]=recy[n]=1;return n;}void Destory(int x){v[x]=l[x]=r[x]=sum[x]=father[x]=recy[x]=0;if(x==n)n--;}int getroot(){return root;}int FindVal(int vs){int now=root;if(!now) return 0;while(true){if(v[now]==vs){Splay(now,root);return root;}int next=vs<v[now]?0:1;if(!(next?r[now]:l[now])) return 0;now=(next?r[now]:l[now]);}}int Build(int vs){points++;if(!n){root=1;CrePoint(vs,0);}else{int now=root;while(1){sum[now]++;if(vs==v[now]){recy[now]++;return now;}int next=vs<v[now]?0:1;if(!(next?r[now]:l[now])){CrePoint(vs,now);if(next) r[now]=n;else l[now]=n;return n;}now=next?r[now]:l[now];}}return 0;}void Insert(int vs){int add=Build(vs);Splay(add,root);}void Remove(int vs){int deal=FindVal(vs);if(!deal) return;points--;if(recy[deal]>1){recy[deal]--;sum[deal]--;return;}if(!l[deal]){root=r[deal];father[root]=0;}else{int lef=l[deal];while(r[lef]) lef=r[lef];Splay(lef,l[deal]);int rig=r[deal];Connect(rig,lef,1);Connect(lef,0,1);Updata(lef);}Destory(deal);}int GetRankByVal(int vs){int now=root;if(!now) return 0;while((vs>v[now]?r[now]:l[now])&&vs!=v[now])now=(vs>v[now]?r[now]:l[now]);Splay(now,root);return sum[l[root]];}int GetValByRank(int x){if(x>points) return -INF;int now=root;while(1){int minused=sum[now]-sum[r[now]];if(x>sum[l[now]]&&x<=minused) break;if(x<minused)now=l[now];else{x-=minused;now=r[now];}}Splay(now,root);return v[now];}int Upper(int vs){int now=root;int result=INF;while(now){if(v[now]>vs&&v[now]<result) result=v[now];if(vs<v[now]) now=l[now];else now=r[now];}return result;}int Lower(int vs){int now=root;int result=-INF;while(now){if(v[now]<vs&&v[now]>result) result=v[now];if(vs>v[now]) now=r[now];else now=l[now];}return result;}#undef root
}a;
int main(){freopen("testdata.in","r",stdin);freopen("data.out","w",stdout);a.Insert(-INF);a.Insert(INF);int m;scanf("%d",&m);while(m--){int opt,x;scanf("%d%d",&opt,&x);if(opt==1) a.Insert(x);if(opt==2) a.Remove(x);if(opt==3) printf("%d\n",a.GetRankByVal(x));if(opt==4) printf("%d\n",a.GetValByRank(x+1));if(opt==5) printf("%d\n",a.Lower(x));if(opt==6) printf("%d\n",a.Upper(x));}
}

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

  1. 【模板篇】splay(填坑)+模板题(普通平衡树)

    划着划着水一不小心NOIP还考的凑合了- 所以退役的打算要稍微搁置一下了- 要准备准备省选了-. 但是自己已经啥也不会了- 所以只能重新拾起来- 从splay开始吧- splay我以前扔了个板子来着, ...

  2. hihocoder #1329 : 平衡树·Splay

    #1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...

  3. 平衡树(Splay) 服务:第一弹——旋转的艺术

    平衡树(Splay) 服务:第一弹--旋转的艺术 0.前言 本蒟蒻前不久刚学SPLAY,有了一点心得,想要巩固下来.同时也觉得网上的神犇们实在太强了,有的内容并不能很好的让我这样的蒟蒻理解,因此便有了 ...

  4. 【洛谷P3369】 (模板)普通平衡树

    https://www.luogu.org/problemnew/show/P3369 Splay模板 1 #include<iostream> 2 #include<cstdio& ...

  5. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 6881  Solved: 4213 [Submit][S ...

  6. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  7. 史上最详尽的平衡树(splay)讲解与模板

    首先声明:万分感谢gty大哥的帮助!这年头能找到简单易懂的数组版平衡树模板只能靠学长了! 变量声明:f[i]表示i的父结点,ch[i][0]表示i的左儿子,ch[i][1]表示i的右儿子,key[i] ...

  8. 【洛谷P3369】普通平衡树(splay)

    emmmmm直接丢代码了 #include<iostream> #include<cstdio> #include<cstring> #include<str ...

  9. 文艺平衡树 Splay 学习笔记(1)

    (这里是Splay基础操作,reserve什么的会在下一篇里面讲) 好久之前就说要学Splay了,结果苟到现在才学习. 可能是最近良心发现自己实在太弱了,听数学又听不懂只好多学点不要脑子的数据结构. ...

  10. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

最新文章

  1. 【其他】GIT常用原生命令
  2. 为什么Python发展这么快,有哪些优势?
  3. BZOJ 3626: [LNOI2014]LCA
  4. boost::regex模块通用对象缓存的测试代码
  5. EIGENVECTORS FROM EIGENVALUES论文结论举例验证
  6. 观察+|腾讯网易终获游戏版号,但all in 游戏时代已结束
  7. graphics 位深度_热门上海乐家人才公寓深度解析又是一个神
  8. Android自定义ImageView(二)——实现双击放大与缩小图片
  9. SAP License:由师姐的包包所想到如何能够掌握客户的需求
  10. node解决通过npm无法安装forever的方法
  11. Linux内核模块静态加载的顺序
  12. time 测试一条命令的执行时间
  13. PKI/CA工作原理及架构
  14. 随机微分方程学习笔记01 相对布朗运动的Ito积分
  15. 偏微分方程数值解程序设计与实现——数学基础
  16. html 分页table,利用JS实现HTML TABLE的分页
  17. Elasticsearch 集群报错 master not discovered yet
  18. 深度剖析:针对深度学习的GPU共享
  19. gcc常用命令与gcc编译器背后的故事
  20. [免费分享]微信小程序从入门到精通视频教程 [8.2G]

热门文章

  1. # 睡眠3秒_【for fun】睡眠排序算法
  2. php gd库 函数 建立gif,PHP_PHP GD库生成图像的几个函数总结,使用GD库中提供的函数动态绘 - phpStudy...
  3. selenium java 参数化_Java+selenium 自动化测试【03】-- 数据驱动之参数化
  4. 软件构造学习笔记-第八周
  5. C++实现数组模拟链表(实现链表的增删功能)
  6. C++unique函数应用举例
  7. linux加大ram 内核需要,Linux 5.1内核发布:io_uring接口+支持持久性内存用作RAM
  8. word List25
  9. java printf 版本_java – PrintStream类型中的printf(String,Object ...
  10. 使用Hash碰撞进行DoS攻击