bzoj1861[Zjoi2006]Book 书架

题意:

维护一个序列,支持移动元素,查询元素是第几个,查询第k个元素编号。

题解:

可以用treap和splay,我写的是splay。移动元素就是先删一个节点在将这个节点插入到对应位置,注意各种分操作(如splay、find)的次序性。反思:本弱又WA又T,最后自己造了一个极限数据发现死循环了,对着大数据调了半天才发现是分操作次序不当导致错误。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define inc(i,j,k) for(int i=j;i<=k;i++)
 5 #define maxn 80100
 6 using namespace std;
 7
 8 int ch[maxn][2],fa[maxn],v[maxn],sz[maxn],pos[maxn],root,book[maxn],tot,n,m;
 9 inline int read(){
10     char ch=getchar(); int f=1,x=0;
11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();};
12     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
13     return f*x;
14 }
15 inline void update(int x){sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;}
16 void rotate(int x){
17     if(!x||!fa[x])return; int a=fa[x],b=fa[fa[x]]; bool c=x==ch[fa[x]][1],d=a==ch[fa[a]][1];
18     if(b)ch[b][d]=x; fa[x]=b; ch[a][c]=ch[x][!c]; if(ch[x][!c])fa[ch[x][!c]]=a; ch[x][!c]=a; fa[a]=x;
19     update(a); update(x); if(b)update(b);
20 }
21 void splay(int x,int y){
22     if(x==y)return; int z=fa[y];
23     while(fa[x]!=z){
24         if(fa[x]!=y)(x==ch[fa[x]][1])^(fa[x]==ch[fa[fa[x]]][1])?rotate(x):rotate(fa[x]);
25         rotate(x);
26     }
27     if(root==y)root=x;
28 }
29 void build(int x,int l,int r){
30     int mid=l+r>>1; v[x]=book[mid]; pos[book[mid]]=x;
31     if(l<=mid-1)ch[x][0]=++tot,build(ch[x][0],l,mid-1),fa[ch[x][0]]=x;
32     if(mid+1<=r)ch[x][1]=++tot,build(ch[x][1],mid+1,r),fa[ch[x][1]]=x;
33     update(x);
34 }
35 int querynum(int x,int k){
36     if(k<=sz[ch[x][0]])return querynum(ch[x][0],k);
37     if(k==sz[ch[x][0]]+1)return x;
38     return querynum(ch[x][1],k-sz[ch[x][0]]-1);
39 }
40 int queryrank(int x){
41     splay(x,root); return sz[ch[x][0]];
42 }
43 int pre(int y){
44     splay(y,root); return querynum(ch[y][0],sz[ch[y][0]]);
45 }
46 int nex(int y){
47     splay(y,root); return querynum(ch[y][1],1);
48 }
49 void add(int x,int y,int z){
50     splay(y,root); splay(x,ch[root][0]); ch[x][1]=z; fa[z]=x; update(x); update(root);
51 }
52 void erase(int z){
53     int x=pre(z),y=nex(z); splay(y,root); splay(x,ch[root][0]); ch[x][1]=0; fa[z]=0; update(x); update(root);
54 }
55 void top(int s){
56     int x=pos[s]; erase(x); int y=querynum(root,1),z=nex(y); add(y,z,x);
57 }
58 void bottom(int s){
59     int x=pos[s]; erase(x); int y=querynum(root,sz[root]-1),z=nex(y); add(y,z,x);
60 }
61 void insert(int s,int t){
62     int a1=pos[s],a2=queryrank(a1)+t; erase(a1); int a3=querynum(root,a2),a4=nex(a3); add(a3,a4,a1);
63 }
64 int ask(int s){return queryrank(pos[s])-1;}
65 int query(int s){return v[querynum(root,s+1)];}
66 int main(){
67     n=read(); m=read(); inc(i,2,n+1)book[i]=read(); tot=root=1; build(root,1,n+2);
68     inc(i,1,m){
69         char opt[8]; scanf("%s",opt);
70         if(opt[0]=='T'){int a=read(); top(a);}
71         if(opt[0]=='B'){int a=read(); bottom(a);}
72         if(opt[0]=='I'){int a=read(),b=read(); insert(a,b);}
73         if(opt[0]=='A'){int a=read(); printf("%d\n",ask(a));}
74         if(opt[0]=='Q'){int a=read(); printf("%d\n",query(a));}
75     }
76     return 0;
77 }

20160811

转载于:https://www.cnblogs.com/YuanZiming/p/5769472.html

bzoj1861[Zjoi2006]Book 书架相关推荐

  1. BZOJ1861: [Zjoi2006]Book 书架

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

  2. splay伸展树基础操作(bzoj 1861: [Zjoi2006]Book 书架)

    splay:一种排序树(中序遍历权值有序) 主要性质:随着访问翻转次数的增多,复杂度越来越接近logn,形态也越来越接近平衡树 主要功能:每次将要询问or删除or修改的点先一路翻转到根,然后再满足所需 ...

  3. BZOJ1861:[ZJOI2006]书架(Splay)

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

  4. 【Splay】【ZJOI2006】书架

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

  5. BZOJ 1861 ZJOI2006 Book 书架 Splay

    题目大意:--自己看懒得打了 很裸的Splay 首先开一个指针数组记录每个值代表的节点 然后就能找到某本书在序列中的什么位置了 总感觉这题可以不用Splay的说--一定是我的错觉 样例中居然尼玛有中文 ...

  6. [Splay伸展树]splay树入门级教程

    首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. 首先引入一下splay的概念,他的中文名是伸展树,意思差不多就是可以随意翻转的二叉树 PS:百度百科中伸展树读作:BoGa ...

  7. oracle表空间追加数据文件,oracle数据库表空间追加数据库文件方法

    mysql优化(初学) 写的时候遇到了SQL语句的优化问题,在网上搜了一些学习.http://blog.csdn.net/kennyrose/article/details/7532032 索引: 1 ...

  8. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  9. luogu P2596 [ZJOI2006]书架(平衡树、无旋treap(按排名分裂)一些更复杂的操作)

    P2596 [ZJOI2006]书架 无旋treap可以维护一棵树的中序遍历结果.但是不支持通过编号来找节点.于是在无旋treap的基础上,我维护了每个节点的父亲,这样就可以求出一个节点是中序遍历中的 ...

最新文章

  1. b站弹幕 xml php 乱码,B站弹幕Python爬行XML响应中的代码转换问题,python,之,取,b,xml,时,转码...
  2. 法国呼叫服务公司Aircall获得800万美元融资
  3. 【流媒体服务器的搭建】1. 源码编译安装x264
  4. UI5 Control lazy load mechanism
  5. 安装linux18双系统,Win10 安装Linux ubuntu-18.04双系统(安装指南)
  6. display:table-cell的集中应用
  7. springboot+自定义注解实现灵活的切面配置
  8. Java for LeetCode 036 Valid Sudoku
  9. 2021必看!java电子书合集
  10. 如何下载互联网上的所有网页
  11. springboot整合腾讯云短信服务
  12. 手机屏幕分辨率真的是越高越清晰吗?
  13. C语言工程网络图,三分钟教你学会 双代号网络图的绘制
  14. 火灾报警管理系统java,火灾报警系统开题报告
  15. 前端HTML+CSS之网页排版(三)
  16. 阿里云服务器SSL不可用
  17. 随遇而安也是一种选择
  18. 用四种不同的方法实现 tab栏切换
  19. android锁屏快捷键设置,Android4.0+锁屏程序开发——设置锁屏页面篇
  20. 微信小程序 如何上传音视频到百度云Bos cloud BCE

热门文章

  1. 【安全牛学习笔记】手动漏洞挖掘(二)
  2. 【Java学习笔记之三十一】详解Java8 lambda表达式
  3. 大数据Python学习大纲
  4. QT5(一):HelloWord
  5. ViolinMemory上市遇低迷 唱衰闪存为哪般?
  6. 令人纠结的表单设计:水平选项 Or 垂直选项?
  7. pku2250--Compromise(最长公共子串,记录结果)
  8. 果你的浏览器关闭了 java,weblogic之CVE-2018-3191漏洞分析
  9. 周边pd是什么意思_肿瘤百问百答(六)关于胃癌的PD-1抗体治疗,你应该知道些什么?...
  10. Cocos2d-x-3.0rc0创建新项目