BZOJ 1861 [Zjoi2006]Book 书架 ——Splay
【题目分析】
模板题目。
首尾两个虚拟结点,十分方便操作。
【代码】
#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的更多相关文章
- BZOJ 1861: [Zjoi2006]Book 书架 splay
1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...
- BZOJ 1861: [Zjoi2006]Book 书架 | SPlay 板题
#include<cstdio> #include<algorithm> #include<cstring> #define N 80010 #define whi ...
- BZOJ 1861: [Zjoi2006]Book 书架 (splay)
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1453 Solved: 822[Submit][Stat ...
- BZOJ 1861: [Zjoi2006]Book 书架
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1290 Solved: 740[Submit][Stat ...
- bzoj1861 [Zjoi2006]Book 书架——splay
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1861 发现自己想splay的时候总是纠结那个点权是什么,因为splay原本是二分查找树... ...
- [bzoj 1861][zjoi2006] 书架
传送门 Description 1. Top S--表示把编号为S的书放在最上面. 2. Bottom S--表示把编号为S的书放在最下面. 3. Insert S T--T∈{-1,0,1},若编号 ...
- bzoj1861 [Zjoi2006]Book 书架 splay
小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引 ...
- [题解]bzoj 1861 Book 书架 - Splay
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1396 Solved: 803[Submit][Stat ...
- BZOJ-1861 Book 书架 Splay
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1010 Solved: 588 [Submit][Stat ...
随机推荐
- SQL根据出生日期精确计算年龄、获取日期中的年份、月份
第一种: 一张人员信息表里有一人生日(Birthday)列,跟据这个列,算出该人员的年龄 datediff(year,birthday,getdate()) 例:birthday = '2003-3- ...
- java字符串拼接技巧(StringBuilder使用技巧)
在平时的开发中,我们可能会遇到需要拼接如下格式的字符串(至少我是遇到了很多次): 1,2,3,4,5,6,7,8,9,10,11,12,12,12,12,34,234,2134,1234,1324,1 ...
- WPF知识点全攻略09- 附加属性
附加属性也是一种特殊的依赖属性. Canvas中的Canvas.Left,Canvas.Top ,DockPanel中DockPanel.Dock等就是附加属性. 更加.NET类属性的写法经验.这个中 ...
- iOS开发各种证书问题
引言 写在前面 一.App ID(bundle identifier) 二.设备(Device) 三.开发证书(Certificates) 四.供应配置文件(Provisioning ...
- 洛谷 P1032 字串变换 (BFS)
题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...
- bootstrap历练实例:按钮作为输入框组前缀或后缀
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- java在线聊天项目0.8版 实现把服务端接收到的信息返回给每一个客户端窗口中显示功能
迭代器的方式会产生锁定 服务器端增加发送给每个客户端已收到信息的功能 所以当获取到一个socket,并打开它的线程进行循环接收客户端发来信息时,我们把这个内部类的线程Client保存到集合List&l ...
- POJ 3080 Blue Jeans、POJ 3461 Oulipo——KMP应用
题目:POJ3080 http://poj.org/problem?id=3080 题意:对于输入的文本串,输出最长的公共子串,如果长度相同,输出字典序最小的. 这题数据量很小,用暴力也是16ms,用 ...
- html中footer如何一直保持在页底
最近在开发博客过程中,遇到有些body的height是比window的height要低的,然后就出现了footer在页面中间的尴尬样子.那么这种情况怎么解决呢: 首先,写一个footer标签: < ...
- NFS网络共享服务 挂载参数及优化 内核优化建议
配置NFS服务端 nfs01上安装软件 [root@nfs01 ~]# yum install nfs-utils rpcbind -y nfs-utils:NFS服务的主程序,包括rpc.nfsd. ...