【题目分析】

模板题目。

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

【代码】

#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. 洛谷 P1629 邮递员送信

    题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...

  2. UISearchBar clearButton

    When the searchBar:textDidChange: method of the UISearchBarDelegate gets called because of the user ...

  3. spark 之主成分分析

    C4∗2

  4. HDU-6035 Colorful Tree(树形DP) 2017多校第一场

    题意:给出一棵树,树上的每个节点都有一个颜色,定义一种值为两点之间路径中不同颜色的个数,然后一棵树有n*(n-1)/2条 路径,求所有的路径的值加起来是多少. 思路:比赛的时候感觉是树形DP,但是脑袋 ...

  5. 一、submit和button区别

    一.submit和button区别 一.HTTP方法:GET.POST

  6. Asp.Net Core 进阶(三)—— IServiceCollection依赖注入容器和使用Autofac替换它

    Asp.Net Core 提供了默认的依赖注入容器 IServiceCollection,它是一个轻量级的依赖注入容器,所以功能不多,只是提供了基础的一些功能,要实现AOP就有点麻烦,因此在实际工作当 ...

  7. 洛谷 P3958 奶酪

    谨以此题来纪念我爆炸的NOIp2017 这个题虽然很多人说是并查集,但是搜索也是毫无压力的,考场搜索细节写挂,爆了个不上不下的80分.今天无意看到这道题,终于AC 首先这道题要考虑一下精度问题,虽然出 ...

  8. CF-1072-C. Cram Time(贪心,数学)

    CF-1072-C. Cram Time http://codeforces.com/contest/1072/problem/C 题意: 第一天有 a 小时,第二天有 b 小时.第 k 个任务需要 ...

  9. verilog disable 用法 (易错!)

    disable语句可以退出任何循环,能够终止任何begin..end块的执行,用于仿真验证中. 例如 begin:one ;i<;i=i+) begin:two ) disable one; / ...

  10. Perl学习之四:语句(续)

    循环控制:1.last 退出标签的语句块2.next 3.redo不推荐,循环次数不可控 4.goto不推荐.***************************************标签: 先 ...