【题目分析】

模板题目。

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

【代码】

#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. android布局不带参数返回

    package com.example.lesson3_4; import java.util.ArrayList; import java.util.List; import android.app ...

  2. mysql> set sql_mode='no_auto_value_on_zero';

    mysql> set sql_mode='no_auto_value_on_zero';

  3. Android程序初体验

    第一个程序的实现的最终功能是: 点击"正确"或者"错误"会得到一个是否正确的提示. 直接上效果图.     此次涉及代码编写的文件有4个: package co ...

  4. PHP识别二维码功能,php-zbarcode 安装

    php-zbarcode是PHP识别二维码的扩展. 下面是安装方法,安装前要先安装ImageMagick.zbar. php-zbarcode 下载地址 安装ImageMagick: yum inst ...

  5. Spring下读取properties文件

    由于在spring的xml文件中配置了 <bean id="validator" class="org.springframework.validation.bea ...

  6. GoAccess参数选项

    GoAccess - 1.2 Usage: goaccess [filename] [ options ... ] [-c][-M][-H][-q][-d][...]The following opt ...

  7. The Django Book - 第四章 模板2

    模板(相应)使用的几种方式: 1.使用HttpResponse返回字符串HTML from django.http import HttpResponse def current_datetime(r ...

  8. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 长时间没连接mysql断开了, ...

  9. int型除以int型

    int型除以int型得到的还是int型 就算你是这样的:float a = 5/3,虽然你定义的a是float型,但a得到的结果依旧是1.0000而不是1.66666 5/3先得到1,然后再转换成1. ...

  10. cdlinux

    xset q xset s 6000 xset -dpms ntpdate time.nist.gov date