[ZJOI 2006]书架
Description
小T有一个很大的书柜。这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列。她用1到n的正整数给每本书都编了号。
小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本。由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置。不 过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就 只可能有X-1、X或X+1本书。
当然也有特殊情况,比如在看书的时候突然电话响了或者有朋友来访。这时候粗心的小T会随手把书放在书柜里所有书的最上面或者最下面,然后转身离开。
久而久之,小T的书柜里的书的顺序就会越来越乱,找到特定的编号的书就变得越来越困难。于是她想请你帮她编写一个图书管理程序,处理她看书时的一些操作,以及回答她的两个提问:(1)编号为X的书在书柜的什么位置;(2)从上到下第i本书的编号是多少。
Input
第一行有两个数n,m,分别表示书的个数以及命令的条数;第二行为n个正整数:第i个数表示初始时从上至下第i个位置放置的书的编号;第三行到m+2行,每行一条命令。命令有5种形式:
1. Top S——表示把编号为S的书房在最上面。
2. Bottom S——表示把编号为S的书房在最下面。
3. Insert S T——T∈{-1,0,1},若编号为S的书上面有X本书,则这条命令表示把这本书放回去后它的上面有X+T本书;
4. Ask S——询问编号为S的书的上面目前有多少本书。
5. Query S——询问从上面数起的第S本书的编号。
Output
对于每一条Ask或Query语句你应该输出一行,一个数,代表询问的答案。
Sample Input
10 10 1 3 2 7 5 8 10 4 9 6 Query 3 Top 5 Ask 6 Bottom 3 Ask 3 Top 6 Insert 4 –1 Query 5 Query 2 Ask 2
Sample Output
2 9 9 7 5 3
Hint
100%的数据,n,m <= 80000
题解
其实除了$Splay$,则道题还可以用$Treap$做。
以$key$为关键词,表示其在书架中的位置,若插在两本书中间,直接取$mid$就可以。
$double$有误差,建议一开始就把书架位置的公差调大。
1 #include<cmath> 2 #include<ctime> 3 #include<queue> 4 #include<stack> 5 #include<cstdio> 6 #include<string> 7 #include<cstdlib> 8 #include<cstring> 9 #include<iostream> 10 #include<algorithm> 11 using namespace std; 12 const int N=160000; 13 const int X=0.00000001; 14 15 struct node 16 { 17 double key; 18 int lev,num,low; 19 node *child[2]; 20 } T[N+5],*root,*pos; 21 double key[N+5],miner,maxer; 22 int n,m,x,y; 23 char c; 24 25 void NewNode(node* &r,double key,int num); 26 void Insert(node* &r,double key,int num); 27 void Delete(node* &r,double key); 28 int Query(node* r,int rank,int cnt); 29 int Ask(node* r,double key); 30 void Rotate(node* &r,bool t); 31 int Count(node* r); 32 double my_abs(double x) {return x<0 ? -x:x;} 33 int Read(); 34 35 int main() 36 { 37 srand(time(0)); 38 root=NULL; 39 pos=T; 40 n=Read(); 41 m=Read(); 42 miner=1; 43 maxer=n; 44 for (int i=1;i<=n;i++) 45 { 46 x=Read(); 47 key[x]=i; 48 Insert(root,key[x],x); 49 } 50 while(m--) 51 { 52 c=0; 53 while(c<'A'||c>'Z') c=getchar(); 54 if (c=='T') 55 { 56 x=Read(); 57 Delete(root,key[x]); 58 key[x]=--miner; 59 Insert(root,key[x],x); 60 } 61 else if (c=='B') 62 { 63 x=Read(); 64 Delete(root,key[x]); 65 key[x]=++maxer; 66 Insert(root,key[x],x); 67 } 68 else if (c=='I') 69 { 70 x=Read(); 71 y=Read(); 72 if (y==0) continue; 73 int a=Ask(root,key[x]); 74 if (a==n-1&&y==1) 75 { 76 Delete(root,key[x]); 77 key[x]=++maxer; 78 Insert(root,key[x],x); 79 continue; 80 } 81 if (a==2&&y==-1) 82 { 83 Delete(root,key[x]); 84 key[x]=--miner; 85 Insert(root,key[x],x); 86 continue; 87 } 88 Delete(root,key[x]); 89 if (y==1) key[x]=(key[Query(root,a,0)]+key[Query(root,a+y,0)])/2.0; 90 else key[x]=(key[Query(root,a+y,0)]+key[Query(root,a+y*2,0)])/2.0; 91 Insert(root,key[x],x); 92 } 93 else if (c=='A') 94 { 95 x=Read(); 96 printf("%d\n",Ask(root,key[x])-1); 97 } 98 else if (c=='Q') 99 { 100 x=Read(); 101 printf("%d\n",Query(root,x,0)); 102 } 103 else break; 104 } 105 return 0; 106 } 107 108 int Read() 109 { 110 int sum=0; 111 bool ok=0; 112 c=0; 113 while ((c<'0'||c>'9')&&c!='-') c=getchar(); 114 if (c=='-') 115 { 116 ok=1; 117 c=getchar(); 118 } 119 while (c>='0'&&c<='9') 120 { 121 sum=sum*10+c-'0'; 122 c=getchar(); 123 } 124 return ok ? -sum:sum; 125 } 126 void NewNode(node* &r,double key,int num) 127 { 128 r=pos++; 129 r->key=key; 130 r->num=num; 131 r->low=1; 132 r->lev=rand(); 133 } 134 void Insert(node* &r,double key,int num) 135 { 136 if (!r) 137 { 138 NewNode(r,key,num); 139 return; 140 } 141 bool t=key>r->key; 142 if (!t) r->low++; 143 Insert(r->child[t],key,num); 144 if (r->child[t]->lev<r->lev) 145 { 146 Rotate(r,!t); 147 r->low=1+Count(r->child[0]); 148 } 149 } 150 void Delete(node* &r,double key) 151 { 152 if (my_abs(r->key-key)<=X) 153 { 154 if (r->child[0]&&r->child[1]) 155 { 156 bool t=r->child[0]->lev<r->child[1]->lev; 157 Rotate(r,t); 158 r->low=1+Count(r->child[0]); 159 if (!t) r->low--; 160 Delete(r->child[t],key); 161 } 162 else 163 { 164 if (r->child[0]) r=r->child[0]; 165 else r=r->child[1]; 166 } 167 } 168 else 169 { 170 bool t=key>r->key; 171 if (!t) r->low--; 172 Delete(r->child[t],key); 173 } 174 } 175 void Rotate(node* &r,bool t) 176 { 177 node *y=r->child[!t],*R=r; 178 r->child[!t]=y->child[t]; 179 y->child[t]=r; 180 r=y; 181 R->low=1+Count(R->child[0]); 182 } 183 int Query(node* r,int rank,int cnt) 184 { 185 //cout<<cnt<<" "<<rank<<" "<<r->low<<endl; 186 if (r->low+cnt==rank) return r->num; 187 if (r->low+cnt<rank) return Query(r->child[1],rank,r->low+cnt); 188 if (r->low+cnt>rank) return Query(r->child[0],rank,cnt); 189 } 190 int Ask(node* r,double key) 191 { 192 if (my_abs(r->key-key)<=X) return r->low; 193 if (r->key<key) return r->low+Ask(r->child[1],key); 194 if (r->key>key) return Ask(r->child[0],key); 195 } 196 int Count(node* r) 197 { 198 if (!r) return 0; 199 return r->low+Count(r->child[1]); 200 }
转载于:https://www.cnblogs.com/NaVi-Awson/p/7244497.html
[ZJOI 2006]书架相关推荐
- 解题:ZJOI 2006 书架
题面 学习了如何在维护序列的平衡树上查找某个数:按初始的顺序定个权值,然后每次找那个权值的DFS序即可.具体实现就是不停往上跳,然后是父亲的右儿子就加上父亲的左儿子,剩下的就是继续熟悉无旋树堆 1 # ...
- 【EXLIBRIS】纸版书目整理 -- 大书架 上 【292 种】【327册】
为了避免往年光说不练的现象,提前开始整理,并post在这里,接受监督,:) 一.大书架 上 [292 种][327册] 书名 存放位置 出版社 史记(全本) 大书架上 中州古籍出版社 儒林外史 大 ...
- DevOps读书清单:十本应该放入书架的经典
DevOps为企业生产带来了质的飞越,通过整合 IT 开发.运维.支持和管理等大幅提升生产效率.今天小数带来的十本 DevOps 经典著作,帮助大家深入研究 DevOps ,快把它们收入学习书架吧! ...
- 我的3D游戏开发书架
入门级: 计算机图形书教程.[清华大学出版社]. 陆润民 编著.2003.7月第一版. // 一本很薄的图书.内容很简单,很适合我这种看到数学就头有点疼的人读.里面的图形变换,三 ...
- 我的3D游戏开发书架 1
入门级: 计算机图形书教程.[清华大学出版社]. 陆润民 编著.2003.7月第一版. // 一本很薄的图书.内容很简单,很适合我这种看到数学就头有点疼的人读.里面的图形变换,三 ...
- 到微软Tech•ED 2006技术大会一游
微软Tech·ED2006北京站的活动于2006年9月21号到23号在北京六环外(好远!)的九华山庄举行.说来惭愧,自诩为"MS Fans"的我,却只参加了22号的活动. 这是我第 ...
- [转贴]2006十大经典语句
1. 骑白马的不一定是王子,他可能是唐僧: 2. 带翅膀的也不一定是天使,他可能是鸟人. 3. 站的更高,尿的更远. 4. 穿别人的鞋,走自己的路,让他们找去吧, 5. 我不是随便的人.我随便起来不是 ...
- 金山发布《2006年度信息安全报告》
2006年度,国内的互联网环境因接踵而至的信息安全事件一再掀起了波澜.作为国内领先的信息安全厂商,金山毒霸同数千万国内用户一起见证了对病毒.对流氓软件发出的各种绝技杀手锏. 2007年2月8日,金山软 ...
- Infragistics NetAdvantage 2006 Volume 2 CLR 2.0曲折安装
上个月看到Infragistics NetAdvantage 2006 Volume 2 CLR 2.0(新特性)新鲜出炉,就一直想安装试用.昨天qq上得知已经有人在使用了,赶紧google一个dow ...
最新文章
- 斯坦福的人工智能4年路线!
- SQL Server 监控系列(文章索引)
- 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 EventChannel 通信 )
- 2亿QQ用户大调度背后的架构设计和高效运营(上)
- PHP(一)——概述及服务器配置
- 安装、配置文件-配置 CACTI 监控 MySQL 数据库状态-by小雨
- [洛谷P3242] [HNOI2015]接水果
- php中的加密解密模块-mcrypt
- MATLAB非线性最小二乘lsqnonlin
- 【图像跟踪】基于matlab GUI均值漂移图像跟踪【含Matlab源码 743期】
- PSP开发简明教程(1)
- 阿里飞天云平台架构简介
- java jersey,java Jersey
- 五分理解IaaS,PaaS,SaaS都是什么
- 前端网站开发页面重定向的几种方法
- 分享职场心得《14》
- 指针数组和指向指针的指针
- 图片验证码不显示解决方案
- Excel中将人民币金额小写转成大写(转)
- python输出最长字符串_使用Python打印最长的字母子字符串,并打结...
热门文章
- 神操作!傅里叶变换取代Transformer自注意力层
- 聊聊研读论文有哪些经验之谈?
- 收藏 | 13则PyTorch使用的小窍门
- 全局路径规划:图搜索算法介绍3(A stars tie breaker)
- php大量数据库抽象,PHP系列(十二)数据库抽象层pdo
- 实现API接口调用--来源阿里云大学-归档
- matplotlib柱状图_Python可视化很简单,一文学会绘制柱状图、条形图和直方图
- android java 指针异常处理,Android自定义抛出异常的方法详解
- MySQL如何生成idf文件_【IDF2010】释放三大特性 至强7500为MySQL量身定做
- 安装scws需要安装php吗,Linux 安装SCWS-1.2.3 安装说明(包括php扩展)