博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Splay(单点修改+查询)
阅读量:5279 次
发布时间:2019-06-14

本文共 2852 字,大约阅读时间需要 9 分钟。

仅供参考。。。

#include
using namespace std;char readc(){ static char buf[100000], *l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF;else return *l++;}int read(){ int x=0,f=1;char ch=readc(); while (!isdigit(ch)) { if (ch=='-') f=-1; ch=readc();} while (isdigit(ch)) x=x*10+ch-48,ch=readc(); return x*f;}namespace splay { const int MAXN=100000+11; int fa[MAXN],ch[MAXN][2],val[MAXN],siz[MAXN],num[MAXN],root,cnt; void clear(int x) { fa[x]=val[x]=siz[x]=num[x]=ch[x][0]=ch[x][1]=0; } void update(int x) { siz[x]=(ch[x][0] ? siz[ch[x][0]]:0)+(ch[x][1] ? siz[ch[x][1]]:0)+num[x]; } int succ() { int x=ch[root][1]; while (ch[x][0]) x=ch[x][0]; return val[x]; } int succ_id() { int x=ch[root][1]; while (ch[x][0]) x=ch[x][0]; return x; } int pre() { int x=ch[root][0]; while (ch[x][1]) x=ch[x][1]; return val[x]; } int pre_id() { int x=ch[root][0]; while (ch[x][1]) x=ch[x][1]; return x; } void rotate(int x) { int y=fa[x],z=fa[y],d=(ch[y][1]==x); ch[y][d]=ch[x][d^1]; fa[ch[x][d^1]]=y; ch[x][d^1]=y; fa[y]=x,fa[x]=z; if (z)ch[z][ch[z][1]==y]=x; update(y); update(x); } void splay(int x) { for (int y; y=fa[x]; rotate(x)) if (fa[y]) rotate((x==ch[y][0])^(y==ch[fa[y]][0]) ? x:y); root=x; } int find_val(int x) { // 查询排名为 x 的数 int y=root,tmp; while (true) { if (ch[y][0]&&siz[ch[y][0]]>=x) y=ch[y][0]; else { tmp=(ch[y][0] ? siz[ch[y][0]]:0)+num[y]; if (x<=tmp) return val[y]; x-=tmp,y=ch[y][1]; } } } int find_rank(int x) { // 查询 x 数的排名 int y=root,tmp=0; while (true){ if (x
1) { num[x]--,siz[x]--; return; } if (!ch[x][0]&&!ch[x][1]) { clear(x);root=0; return; } if (!ch[x][0]||!ch[x][1]) { int y=max(ch[x][0],ch[x][1]); root=y,fa[y]=0;clear(x); return; } int tmp=pre_id(); splay(tmp);fa[ch[x][1]]=tmp;ch[tmp][1]=ch[x][1];clear(x);update(tmp); }}using namespace splay;int main() { int n=read(); while (n--) { int opt=read(),x=read(); switch(opt) { case 1: insert(x); break; case 2: delt(x); break; case 3: printf("%d\n",find_rank(x)); break; case 4: printf("%d\n",find_val(x)); break; case 5: insert(x),printf("%d\n",pre()),delt(x); break; case 6: insert(x),printf("%d\n",succ()),delt(x); break; } } return 0;}

 

转载于:https://www.cnblogs.com/QingCai-DCF/p/9529088.html

你可能感兴趣的文章
AngularJs 学习笔记(2)
查看>>
关于元素优先级
查看>>
oo第一单元作业总结
查看>>
SRS源码——Listener
查看>>
web.xml 4.0 头
查看>>
Java面向对象抽象类案例分析
查看>>
100.Same Tree
查看>>
JAVA 根据经纬度算出附近的正方形的四个角的经纬度
查看>>
Linux系统配置matlab2009b
查看>>
ZH奶酪:基于ionic.io平台的ionic消息推送功能实现
查看>>
对SPI、IIC、IIS、UART、CAN、SDIO、GPIO的解释
查看>>
Thymeleaf模板格式化LocalDatetime时间格式
查看>>
庖丁解“学生信息管理系统”
查看>>
Pyltp使用
查看>>
Java8函数之旅 (七) - 函数式备忘录模式优化递归
查看>>
移植LWIP(ENC28J60)
查看>>
无标题
查看>>
vue+element下拉框样式的点击按钮
查看>>
Vue+element 解决浏览器自动填充记住的账号密码问题
查看>>
c++中减字符0的作用(转)
查看>>