传送门

感觉要死在\(Splay\)里了 orz

这题用\(Splay\)维护这个序列,其中的第\(k\)大点代表这个序列的第\(k\)个数

第一个操作,先把那个数所在的点旋到根,然后把整个根的左子树接到右子树中最小的点,记得\(splay\)维护整棵树

第二个操作类似,把第一个操作反过来就行

第三个本质是两个相邻位置交换值,直接把这个数所在的点和前驱/后继交换值

第四个,把对应的点旋到根,输出左子树大小

第五个,就是整棵树的第\(x\)大点上的值

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register using namespace std;
const int N=80000+10;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,q,b[N],p[N];
int fa[N],ch[N][2],sz[N],a[N],rt,tt;
il void psup(int x){sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;}
il void rot(int x)
{
int y=fa[x],z=fa[y],yy=ch[y][1]==x,w=ch[x][!yy];
ch[z][ch[z][1]==y]=x,fa[x]=z;
ch[y][yy]=w,fa[w]=y;
ch[x][!yy]=y,fa[y]=x;
psup(y),psup(x);
}
il void spl(int x,int en)
{
while(fa[x]!=en)
{
int y=fa[x],z=fa[y];
if(z!=en) ((ch[y][1]==x)^(ch[z][1]==y))?rot(x):rot(y);
rot(x);
}
if(!en) rt=x;
}
il void inst(int x)
{
int nw=rt;
while(ch[nw][x>a[nw]]) nw=ch[nw][x>a[nw]];
/*
++tt,fa[tt]=nw,a[tt]=x;
if(nw) ch[nw][x>a[nw]]=tt;
spl(tt,0);
*/
}
il int gkth(int x)
{
int nw=rt;
while(233)
{
if(x<=sz[ch[nw][0]]) nw=ch[nw][0];
else if(x>sz[ch[nw][0]]+1) x-=sz[ch[nw][0]]+1,nw=ch[nw][1];
else return nw;
}
}
il int bui(int l,int r)
{
if(l>r) return 0;
int mid=(l+r)>>1,nw=++tt;
a[nw]=b[mid],p[b[mid]]=nw,sz[nw]=1;
if(l==r) return nw;
fa[ch[nw][0]=bui(l,mid-1)]=nw;
fa[ch[nw][1]=bui(mid+1,r)]=nw;
psup(nw);
return nw;
} int main()
{
n=rd(),q=rd();
for(int i=1;i<=n;i++) b[i]=rd();
rt=bui(1,n);
char cc[10];
while(q--)
{
scanf("%s",cc);
if(cc[0]=='T')
{
int x=p[rd()];
spl(x,0);
if(!ch[x][0]);
else if(!ch[x][1]) swap(ch[x][0],ch[x][1]);
else
{
int y=gkth(sz[ch[x][0]]+2); //后继
ch[y][0]=ch[x][0],fa[ch[x][0]]=y,ch[x][0]=0;
spl(y,0);
}
}
else if(cc[0]=='B')
{
int x=p[rd()];
spl(x,0);
if(!ch[x][1]);
else if(!ch[x][0]) swap(ch[x][0],ch[x][1]);
else
{
int y=gkth(sz[ch[x][0]]); //前驱
ch[y][1]=ch[x][1],fa[ch[x][1]]=y,ch[x][1]=0;
spl(y,0);
}
}
else if(cc[0]=='I')
{
int x=p[rd()],c=rd();
if(c==1)
{
spl(x,0);
int nt=gkth(sz[ch[x][0]]+2); //主要是这个地方,我本来用普通平衡树里面的求前驱后继,但是这棵树并不是一个权值为关键字的splay,,,
swap(p[a[x]],p[a[nt]]),swap(a[x],a[nt]);
}
else if(c==-1)
{
spl(x,0);
int ft=gkth(sz[ch[x][0]]);
swap(p[a[x]],p[a[ft]]),swap(a[x],a[ft]);
}
}
else if(cc[0]=='A')
{
int x=p[rd()];
spl(x,0);
printf("%d\n",sz[ch[x][0]]);
}
else printf("%d\n",a[gkth(rd())]);
}
return 0;
}

luogu P2596 [ZJOI2006]书架的更多相关文章

  1. fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架

    题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...

  2. 洛谷 P2596 [ZJOI2006]书架 解题报告

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  3. P2596 [ZJOI2006]书架 && Splay 区间操作(三)

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  4. [Luogu 2596] ZJOI2006 书架

    [Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...

  5. P2596 [ZJOI2006]书架(splay)

    [题目链接] https://www.luogu.org/problemnew/show/P2596 平衡树,需支持五个操作: 1. 将某元素置顶:将元素旋到根,然后将左子树合并到该元素的后继 2. ...

  6. [洛谷P2596] [ZJOI2006]书架

    洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...

  7. P2596 [ZJOI2006]书架

    思路 一开始写fhq-treap 感觉越写越感觉splay好些,就去splay 然后维护序列 注意前驱后继的不存在的情况 但不用插入虚拟节点(那插入岂不太麻烦) 跑的真慢的一批,splay太多了 错误 ...

  8. 洛谷 P2596 [ZJOI2006]书架 (splay)

    题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些 ...

  9. 「luogu2569」[ZJOI2006] 书架

    「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...

随机推荐

  1. iOS 页面之间的转场动画控制器间的转换

    CATransition类实现层的转场动画.你可以从一组预定义的转换或者通过提供定制的CIFilter实例来指定转场效果. 例如:控制器之间的跳转 LoginViewController *myVC ...

  2. HDU5399-多校-模拟

    Too Simple Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  3. luogu P2644 树上游戏

    一道点分难题 首先很自然的想法就是每种颜色的贡献可以分开计算,然后如果你会虚树就可以直接做了 点分也差不多,考虑每个分治重心的子树对它的贡献以及它对它子树的贡献 首先,处理一个\(cnt\)数组,\( ...

  4. 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)

    洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...

  5. 洛谷 P2345 奶牛集会 解题报告

    P2345 奶牛集会 题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨 ...

  6. bzoj5281/luogu4377 Talent Show (01分数规划+背包dp)

    就是01分数规划的思路,只不过当把w[i]-r*t[i]>0的选完以后如果w值还没达到要求,那就再01背包dp一下就好了(dp时w值>W的时候就存在W里就不会爆内存了). (跑得很慢..大 ...

  7. 迅雷thunder://协议解密

    echo -n 'thunder://''Cg==' | sed 's?thunder://??' | base64 -d | sed 's/^AA//; s/ZZ$//' 将thunder://替换 ...

  8. PD915温度太高,通过设置BIOS降底CPU的核心电压来降温。

    由于对电脑配置不是很懂,去年去配了台电脑,用的CPU是PD915,不用不知道,一用吓一跳. PD915在冬天的时候,运行起来温度大概在30多度,感觉很正常. 可是一到了夏天,温度就升到了70到80度之 ...

  9. linux下设置默认路径

    查看文件: vim ~/.bash_profile 在bash_profile文件下以编辑模式插入以下代码:其中,/xxx/myname即为要设置的默认路径 SYSTEM=`uname -s` cas ...

  10. win10下通过Anaconda安装TensorFlow-GPU1.3版本,并配置pycharm运行Mnist手写识别程序

    折腾了一天半终于装好了win10下的TensorFlow-GPU版,在这里做个记录. 准备安装包: visual studio 2015: Anaconda3-4.2.0-Windows-x86_64 ...