博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1861 书架 splay版
阅读量:6436 次
发布时间:2019-06-23

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

单点插入删除以及求前缀
#include
#include
#include
using namespace std;const int M=100055,inf=1000000000;int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f;}int n,m,root;int c[M][2],size[M],fa[M],v[M],pos[M];void up(int k){size[k]=size[c[k][0]]+size[c[k][1]]+1;}void rotate(int x,int& k){ int y=fa[x],z=fa[y],l=0,r=1; if(c[y][1]==x) l=1,r=0; if(y==k) k=x; else{
if(c[z][0]==y) c[z][0]=x; else c[z][1]=x;} fa[y]=x; fa[x]=z; fa[c[x][r]]=y; c[y][l]=c[x][r]; c[x][r]=y; up(y); up(x);}void splay(int x,int& k){ while(x!=k){ int y=fa[x],z=fa[y]; if(y!=k){ if(c[z][0]==y^c[y][0]==x) rotate(y,k); else rotate(x,k); } rotate(x,k); }}int find(int x,int rank){ int l=c[x][0],r=c[x][1]; if(size[l]+1==rank) return x; else if(size[l]>=rank) return find(l,rank); else return find(r,rank-size[l]-1);}int build(int l,int r){ if(l>r) return 0; int m=(l+r)>>1; c[m][0]=build(l,m-1); c[m][1]=build(m+1,r); for(int i=0;i<2;i++) if(c[m][i]) fa[c[m][i]]=m; up(m); return m;}void del(int k){ int x,y,z; x=find(root,k-1); y=find(root,k+1); splay(x,root); splay(y,c[x][1]); z=c[y][0]; c[y][0]=0; size[z]=fa[z]=0; up(y); up(x);}void move(int k,int w){ int x,y,z=pos[k],rank; splay(z,root); rank=size[c[z][0]]+1; del(rank); if(w==-inf) x=find(root,1),y=find(root,2); else if(w==inf) x=find(root,n),y=find(root,n+1); else x=find(root,rank+w-1),y=find(root,rank+w); splay(x,root); splay(y,c[x][1]); size[z]=1; fa[z]=y; c[y][0]=z; up(y); up(x);}int main(){ int k,T; n=read(); m=read(); for(int i=2;i<=n+1;i++) v[i]=read(),pos[v[i]]=i; root=build(1,n+2); char ch[15]; while(m--){ scanf("%s",ch); k=read(); if(ch[0]=='T') move(k,-inf); if(ch[0]=='B') move(k,inf); if(ch[0]=='I') T=read(),move(k,T); if(ch[0]=='A') splay(pos[k],root),printf("%d\n",size[c[pos[k]][0]]-1); if(ch[0]=='Q') T=find(root,k+1),printf("%d\n",v[T]); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/6922426.html

你可能感兴趣的文章
MySQL复制介绍及搭建
查看>>
Java在线调试工具
查看>>
[译]CSS-理解百分比的background-position
查看>>
虚拟机安装CentOS
查看>>
Idea里面老版本MapReduce设置FileInputFormat参数格式变化
查看>>
在 win10 环境下,设置自己写的 程序 开机自动 启动的方法
查看>>
Unity3d游戏开发之-单例设计模式-多线程一
查看>>
通过jquery定位元素
查看>>
Tooltip表单验证的注册表单
查看>>
UWP开发中两种网络图片缓存方法
查看>>
超8千Star,火遍Github的Python反直觉案例集!
查看>>
【msdn wpf forum翻译】如何在wpf程序(程序激活时)中捕获所有的键盘输入,而不管哪个元素获得焦点?...
查看>>
全球首家!阿里云获GNTC2018 网络创新大奖 成唯一获奖云服务商
查看>>
Python简单HttpServer
查看>>
Java LinkedList工作原理及实现
查看>>
负载均衡SLB的基本使用
查看>>
Centos 7 x86 安装JDK
查看>>
微信小程序的组件用法与传统HTML5标签的区别
查看>>
Hangfire 使用笔记
查看>>
(C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标?
查看>>