【题目分析】

模板题目。

首尾两个虚拟结点,十分方便操作。

【代码】

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib> #include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 500005
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define L ch[o][0]
#define R ch[o][1] void Finout()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
} int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} int n,m; struct Bit_Tree{
int a[maxn],b[maxn];
void add(int x,int y,int z)
{
for (int i=x;i<=n;i+=i&(-i)) b[i]+=z;
for (int i=y+1;i<=n;i+=i&(-i)) b[i]-=z;
for (int i=x;i<=n;i+=i&(-i)) a[i]+=(n-x)*z;
for (int i=y+1;i<=n;i+=i&(-i)) a[i]-=(n-y-1)*z;
}
int getsum(int x)
{
int ret=0,tmp=0;
for (int i=x;i;i-=i&(-i)) ret+=a[i];
for (int i=x;i;i-=i&(-i)) tmp+=b[i];
return ret-(n-x-1)*tmp;
}
void init()
{
memset(a,0,sizeof a);
memset(b,0,sizeof b);
}
}t; int rt=0,a[maxn],s,T,id[maxn],cnt=0;
char opt[10];
int num[maxn],ch[maxn][2],siz[maxn],fa[maxn],list[maxn]; void update(int o)
{
siz[o]=siz[L]+siz[R]+1;
} void rot(int x,int &k)
{
// cout<<"rot"<<x<<endl;
int y=fa[x],z=fa[y],l,r;
if (ch[y][0]==x) l=0; else l=1;
r=l^1;
if (y==k) k=x;
else
{
if (ch[z][0]==y) ch[z][0]=x;
else ch[z][1]=x;
}
fa[x]=z;
fa[y]=x;
fa[ch[x][r]]=y;
ch[y][l]=ch[x][r];
ch[x][r]=y;
update(y); update(x);
} void splay(int x,int &k)
{
int y,z;
while (x!=k)
{
y=fa[x];z=fa[y];
if (y!=k)
{
if ((ch[z][0]==y)^(ch[y][0]==x)) rot(x,k);
else rot(y,k);
}
rot(x,k);
}
} void ins(int & o,int x,int lst)
{
if (!o)
{
o=++cnt;
fa[o]=lst;
num[o]=x;
siz[o]=1;
list[o]=a[x-1];
splay(o,rt);
return ;
}
if (x<num[o]) ins(ch[o][0],x,o);
else ins(ch[o][1],x,o);
update(o);
} int find(int o,int x)
{
// cout<<"qnum"<<num[o]<<" "<<x<<endl;
if (siz[L]+1==x) return o;
if (siz[L]>=x) return find(L,x);
else return find(R,x-siz[L]-1);
} void print(int o)
{
if (!o) return ;
print(L);
// cout<<"now is "<<o<<endl;
// cout<<L<<" "<<R<<endl;
// cout<<num[o]<<" "<<siz[o]<<endl;
cout<<num[o]<<" ";
print(R);
} void Mov(int o,int k)
{
splay(o,rt);
int pre=find(rt,siz[L]),nxt=find(rt,siz[L]+2);
splay(pre,rt); splay(nxt,ch[rt][1]);
ch[nxt][0]=0; fa[o]=0;
update(nxt); update(pre);
splay(nxt,rt);
pre=find(rt,k-1);nxt=find(rt,k);
splay(pre,rt); splay(nxt,ch[rt][1]);
ch[nxt][0]=o; fa[o]=nxt;
splay(o,rt);
} int main()
{
Finout();
scanf("%d%d",&n,&m);
F(i,1,n) scanf("%d",&a[i]),id[a[i]]=i+1;
F(i,0,n+1) ins(rt,i,0);
// print(rt);
// cout<<rt<<endl;
F(i,1,m)
{
// print(rt);
// cout<<endl;
scanf("%s",opt);
scanf("%d",&s);
if (opt[0]=='Q')
{
// cout<<"QUERY"<<endl;
printf("%d\n",a[find(rt,s+1)-1]);
}
else if (opt[0]=='A')
{
// cout<<"ASK"<<endl;
splay(id[s],rt);
printf("%d\n",siz[ch[rt][0]]-1);
}
else if (opt[0]=='T')
{
// cout<<"TOP"<<endl;
Mov(id[s],1+1);
}
else if (opt[0]=='B')
{
// cout<<"BOT"<<endl;
Mov(id[s],n+1);
}
else
{
T=Getint();
splay(id[s],rt);
int tmp=siz[ch[rt][0]];
Mov(id[s],tmp+T+1);
}
}
}

  

BZOJ 1861 [Zjoi2006]Book 书架 ——Splay的更多相关文章

  1. BZOJ 1861: [Zjoi2006]Book 书架 splay

    1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...

  2. BZOJ 1861: [Zjoi2006]Book 书架 | SPlay 板题

    #include<cstdio> #include<algorithm> #include<cstring> #define N 80010 #define whi ...

  3. BZOJ 1861: [Zjoi2006]Book 书架 (splay)

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1453  Solved: 822[Submit][Stat ...

  4. BZOJ 1861: [Zjoi2006]Book 书架

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1290  Solved: 740[Submit][Stat ...

  5. bzoj1861 [Zjoi2006]Book 书架——splay

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1861 发现自己想splay的时候总是纠结那个点权是什么,因为splay原本是二分查找树... ...

  6. [bzoj 1861][zjoi2006] 书架

    传送门 Description 1. Top S--表示把编号为S的书放在最上面. 2. Bottom S--表示把编号为S的书放在最下面. 3. Insert S T--T∈{-1,0,1},若编号 ...

  7. bzoj1861 [Zjoi2006]Book 书架 splay

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

  8. [题解]bzoj 1861 Book 书架 - Splay

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1396  Solved: 803[Submit][Stat ...

  9. BZOJ-1861 Book 书架 Splay

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1010 Solved: 588 [Submit][Stat ...

随机推荐

  1. 网页设计必备工具 firefox Web Developer插件 CSS工具组教程

    该插件在火狐浏览器中安装.Web Developer 插件强大的功能超乎你的想象,用于CSS网页布局开发调试只是它强大功能的一部分,对于网络程序的开发也提供了非常强大的辅助设计功能,我们不将它完全的展 ...

  2. 安装MySQLdb出现HAVE_WCSCOLL重定义问题的解决方法

    root@wodeyitian MySQL-python-1.2.3]# python setup.py install running install running bdist_egg runni ...

  3. easyui 刷新页面

    window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.location.reload()刷新父窗口对象 ...

  4. SAP Cloud for Customer使用移动设备访问系统的硬件要求

    如果用平板电脑的话,推荐的设备列表: Android Samsung Galaxy Tab S2○ Processor: 2 x quad-core CPU -- 1.9 and 1.3 gigahe ...

  5. solr scheme配置简介

    solr 字段配置,和数据库数据索引配置 配置solr字段. schema.xml 文件里配置 先讲解一下,里面的一些字段 1. <types> ... </types> 表示 ...

  6. 安装linux虚拟机(Ubuntu & KALI)

    VMware workstation 15.0.0 ubuntu-18.10-desktop 首先安装VMware 参考资料很多,不再赘述. 之后参考 https://www.cnblogs.com/ ...

  7. Web项目之Django基础

    Django目录: python项目Django(web服务) python项目Django(HTTP协议) python项目Django(Django的安装与使用) python项目Django(U ...

  8. 来自-小坦克:Fiddler教程

    Fiddler 教程 阅读目录 Fiddler的基本介绍 Fiddler的工作原理 同类的其它工具 Fiddler如何捕获Firefox的会话 Fiddler如何捕获HTTPS会话 Fiddler的基 ...

  9. 思维 || Make It Equal

    http://codeforces.com/contest/1065/problem/C 题意:给你n个高度分别为a[i]的塔,每次可以横着切一刀,切掉不多于k个塔,问最少切多少刀才能把塔切的都一样高 ...

  10. Cocos2d-X研究之3.0 场景切换特效汇总

    Cocos2d-X研究之3.0 场景切换特效汇总 2014-08-05      0个评论    来源:游戏编程    收藏    我要投稿 cocos2d-x 3.0中场景切换特效比较多,而且游戏开 ...