链接:https://www.luogu.org/problemnew/show/P2596

题解:

写了两天的平衡树终于大概弄好了所有模板(模板不熟写错debug真是要死)

对于放在头尾,只需要删除,再在头/尾插入就可以了

对于交换,就交换一下映射

代码:

#include <bits/stdc++.h>
#define maxn 100000
using namespace std;
int n,m,data[maxn],count2[maxn],leftson[maxn],rightson[maxn],fa[maxn],a[maxn],
point[maxn],num,root;
void updata(int x)
{
count2[x]=count2[leftson[x]]+count2[rightson[x]]+;
}
void rotate(int x,int y)
{
int father=fa[x];
if (y==)
{
rightson[father]=leftson[x];
if (leftson[x]) fa[leftson[x]]=father;
} else
{
leftson[father]=rightson[x];
if (rightson[x]) fa[rightson[x]]=father;
}
fa[x]=fa[father];
if (fa[father])
{
if (leftson[fa[father]]==father)
leftson[fa[father]]=x;
else rightson[fa[father]]=x;
}
fa[father]=x;
if (y==) leftson[x]=father; else rightson[x]=father;
updata(father); updata(x);
}
void splay(int x,int goal)
{
if (x==root) return;
int father=fa[x];
while (father!=goal)
{
if (fa[father]==goal)
{
if (x==leftson[father]) rotate(x,); else rotate(x,);
} else
{
if (father==leftson[fa[father]])
{
if (x==leftson[father]) rotate(father,),rotate(x,);
else rotate(x,),rotate(x,);
} else
{
if (x==rightson[father]) rotate(father,),rotate(x,);
else rotate(x,),rotate(x,);
}
}
father=fa[x];
}
if (goal==) root=x;
}
#define mid (h+t)/2
void build(int h,int t,int father,bool x,int a[maxn])
{
count2[++num]=; data[num]=a[mid]; fa[num]=father;
point[a[mid]]=num;
if (father)
{
if (x==) leftson[father]=num; else rightson[father]=num;
}
int tmp=num;
if (h<mid) build(h,mid-,tmp,,a);
if (mid<t) build(mid+,t,tmp,,a);
updata(tmp);
}
int search(int goal)
{
int x=root,cnt=;
while (x)
{
if (cnt+count2[leftson[x]]==goal) return(x);
if (count2[leftson[x]]+cnt<goal)
{
cnt+=count2[leftson[x]]+; x=rightson[x];
} else
{
x=leftson[x];
}
}
}
void delete1()
{
int x=leftson[root];
if (x==)
{
root=rightson[root]; fa[root]=; return;
}
while (rightson[x]) x=rightson[x];
splay(x,root);
rightson[x]=rightson[root];
if (rightson[root]) fa[rightson[root]]=x;
updata(x);
root=x; fa[x]=;
}
void insert1(int x)
{
int y=root;
while (leftson[y]) count2[y]++,y=leftson[y]; count2[y]++;
leftson[y]=x; fa[x]=y; leftson[x]=; rightson[x]=; count2[x]=;
}
void insert2(int x)
{
int y=root;
while (rightson[y]) count2[y]++,y=rightson[y]; count2[y]++;
rightson[y]=x; fa[x]=y; rightson[x]=; leftson[x]=; count2[x]=;
}
void print(int x)
{
if (leftson[x]) print(leftson[x]);
cout<<data[x]<<" ";
if (rightson[x]) print(rightson[x]);
}
char c[];
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
cin>>n>>m;
for (int i=;i<=n;i++)
{
cin>>a[i];
}
build(,n,,,a); root=;
for (int i=;i<=m;i++)
{
// print(root); cout<<i-1<<endl;
cin>>c; int d,e;
if (c[]=='T')
{
cin>>d; int x=point[d]; splay(x,);
delete1(); insert1(x);
}
if (c[]=='B')
{
cin>>d; int x=point[d]; splay(x,);
delete1();
insert2(x);
}
if (c[]=='I')
{
cin>>d>>e;
if (e!=)
{
int x1=point[d]; splay(x1,);
int x2=search(count2[leftson[x1]]++e);
swap(point[d],point[data[x2]]);
swap(data[x2],data[x1]);
}
}
if (c[]=='A')
{
cin>>d; int x=point[d];
splay(x,);
cout<<count2[leftson[x]]<<endl;
}
if (c[]=='Q')
{
cin>>d; int x=search(d);
cout<<data[x]<<endl;
}
}
}

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

  1. 「luogu2569」[ZJOI2006] 书架

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

  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. fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架

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

  6. [ZJOI2006]书架(权值splay)

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

  7. wikioi 1514 and ZJOI2006 书架

    1514 书架 0人推荐 收藏 发题解 提交代码 报错 题目描述 输入描述 输出描述 样例输入 样例输出 提示 题目描述 Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜 ...

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

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

  9. BZOJ1861:[ZJOI2006]书架

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  10. luogu2596 [ZJOI2006]书架

    treap.树是以"优先级"(优先级越小,在书架上越靠上)形成的,堆是以rand()的权值形成的.还要再维护一个原编号. 置顶/置底:找到那个元素,把它拉出来修改优先级再塞回去. ...

随机推荐

  1. 简述var、let、const三者的区别

    前二者为定义变量,const一般用来定义常量. 1.var声明变量可以重复声明,而let不可以重复声明 var name = 'xiaohuang'; var name = 'xiaolan'; co ...

  2. Shell结合Expect实现自动输入密码

    Shell结合Expect自动输入密码示例 #!/bin/bash cd /data/live /usr/bin/expect <<-EOF spawn git clone "s ...

  3. SpringMVC学习笔记_02

    1.springmvc对多视图的支持 (1)导入xml格式视图支持的jar包   注意:springmvc本身就支持xml格式,所以不用导入其他支持的jar包了. (2)在springmvc.xml中 ...

  4. js针对数组的操作

    链接:http://www.w3school.com.cn/jsref/jsref_obj_array.asp Array 对象方法 方法 描述 concat() 连接两个或更多的数组,并返回结果. ...

  5. getattr getattribute setattr hasattr delattr

    getattr是返回对象属性value的函数,用法:getattr(object,attribute_name[,default]) 如果对象拥有属性,则返回属性value,如果对象没有该属性并且也没 ...

  6. EOF \n \0 NULL 之间的区别

    \n 是换行符 \0 是字符串的结束标志 EOF是流的结束标志 FILE* 这种流 NULL 是指针为空 第一个问题是EOF  它是end of file的缩写,表示"文字流"(s ...

  7. Maven入门-依赖管理(Jar包管理)(二)

    1       依赖管理(Jar包管理) 1.添加依赖  

  8. usbserials

    Rerference: http://blog.csdn.net/qwert12131990/article/details/52403034?locationNum=9

  9. mysql 索引无法使用问题

    今天碰到一个问题,表中有一个索引不使用,怎么强制也没用 ,force index都没用, 后来才发现是类型不对, 比如索引字段是int,如果参数使用varchar,那么是无法使用索引的,参数类型最好统 ...

  10. YOLO(v1)

    <You Only Look once:Unified,Real-Time Object Dectection> 以前的图像检测网络其实都是在分类网络的基础上进行修改,而YoLo是将检测问 ...