【BZOJ1861】【splay】Book 书架

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

 

Source

Zjoi2006
【分析】
基本是裸的splay,
找编号弄一个映射过去就好了。
动态内存分配大法好....
  1 /*
  2 唐代李白
  3 《江夏别宋之悌》
  4 楚水清若空,遥将碧海通。人分千里外,兴在一杯中。
  5 谷鸟吟晴日,江猿啸晚风。平生不下泪,于此泣无穷.
  6 */
  7 #include <iostream>
  8 #include <cstdio>
  9 #include <algorithm>
 10 #include <cstring>
 11 #include <vector>
 12 #include <utility>
 13 #include <iomanip>
 14 #include <string>
 15 #include <cmath>
 16 #include <queue>
 17 #include <assert.h>
 18 #include <map>
 19 #include <ctime>
 20 #include <cstdlib>
 21 #include <stack>
 22 #include <set> 
 23 #define LOCAL
 24 const int INF = 0x7fffffff;
 25 const int MAXN = 80000  + 10;
 26 const int maxnode = 20000 * 2 + 200000 * 20;
 27 const int MAXM = 50000 + 10;
 28 const int MAX = 100000000;
 29 using namespace std;
 30 struct Node {
 31        int siz;
 32        int val;//val代表数的编号 
 33        Node *parent, *ch[2];
 34        
 35        int cmp(){
 36            if (parent->ch[0] == this) return 0;
 37            else return 1;
 38        }
 39 }*root, mem[MAXN * 2], *book[MAXN * 2];//book为编号映射 
 40 int tot, n, m;
 41 
 42 Node *NEW(int val){
 43      Node *t = new Node;
 44      t->val = val;
 45      t->siz = 1;
 46      t->parent = t->ch[0] = t->ch[1] = NULL;
 47      return t;
 48 }
 49 void update(Node *&t){
 50      if (t == NULL) return;
 51      t->siz = 1;
 52      if (t->ch[0] != NULL) t->siz += t->ch[0]->siz;
 53      if (t->ch[1] != NULL) t->siz += t->ch[1]->siz;
 54      return ; 
 55 }
 56 void rotate(Node *t, int d){
 57      if (t->parent == NULL) return;//根就没必要旋转了
 58       
 59      Node *p = t->parent;
 60      p->ch[d ^ 1] = t->ch[d];
 61      if (t->ch[d] != NULL) t->ch[d]->parent = p;
 62      t->parent = p->parent;
 63      if (p->parent != NULL){
 64         if (p->parent->ch[1] == p) p->parent->ch[1] = t;
 65         else if (p->parent->ch[0] == p) p->parent->ch[0] = t;
 66      } 
 67      t->ch[d] = p;
 68      p->parent = t;
 69      update(p);
 70      update(t);
 71      if (root == p) root = t;
 72 }
 73 //将x旋转到y的子树,自己都不知道转成什么样子了... 
 74 void splay(Node *x, Node *y){
 75      while (x->parent != y){
 76            if (x->parent->parent == y){
 77               rotate(x, x->cmp() ^ 1);
 78            }else{
 79               Node *t = x->parent;
 80               //之字形
 81               if (t->ch[t->cmp() ^ 1] == x) rotate(x, x->cmp()^1);
 82               else rotate(t, t->cmp() ^ 1);
 83               rotate(x, x->cmp() ^ 1);
 84            }
 85            update(x);
 86      } 
 87      update(x);
 88 }
 89 //找到第k小然后splay上去 
 90 void find(Node *y, int k){
 91       Node *t = root;
 92       while (1){
 93             if (t->siz == 1) break;
 94             int c = (t->ch[0] == NULL ? 0 : t->ch[0]->siz);
 95             if (c + 1 == k) break;
 96             if (c  >= k ) t = t->ch[0];
 97             else {t = t->ch[1], k -= c + 1;}
 98       }
 99       splay(t, y);
100 }
101 //插入到第pos个位置 
102 void insert(Node *t, int pos, int val){
103      find(NULL, pos + 1);
104      find(root, pos + 2);
105      
106      Node *p = NEW(val);
107      root->ch[1]->ch[0] = p;
108      p->parent = root->ch[1];
109      book[val] = p;
110      splay(p, NULL); 
111 }
112 //找到元素val在t中是第几个 
113 int kth(Node *t, int val){
114     splay(book[val], NULL);
115     return root->ch[0]->siz; //不要忘了还有个INF在前面,哈哈哈 
116 }
117 void erase(Node *t, int pos){
118      find(NULL, pos);
119      find(root, pos + 2);
120      Node *p = root->ch[1]->ch[0];
121      p->parent = NULL;
122      root->ch[1]->ch[0] = NULL;
123      delete(p);
124 }
125 
126 void init(){
127      tot = 0;
128      root = NULL;
129      root = NEW(-INF);
130      root->ch[1] = NEW(INF);
131      root->ch[1]->parent = root;
132      update(root);
133      
134      //find(NULL, 2);
135      //printf("%d", root->val);
136      scanf("%d%d", &n, &m);
137      for (int i = 1; i <= n; i++){
138          int t;
139          scanf("%d", &t);
140          insert(root, i - 1, t);
141      }
142      //printf("%d", kth(root, 10));
143 }
144 void work(){
145      for (int i = 1; i <= m; i++){
146          char str[10];
147          scanf("%s", str);
148          if (str[0] == 'T'){//无论任何时候都有n本书
149             int t;
150             scanf("%d", &t); 
151             erase(root, kth(root, t));
152             insert(root, 0, t);
153          }else if (str[0] == 'B'){
154             int t;
155             scanf("%d", &t);
156             erase(root, kth(root, t));
157             insert(root, n - 1, t);
158          }else if (str[0] == 'A'){
159             int t;
160             scanf("%d", &t);
161             printf("%d\n", kth(root, t) - 1);
162          }else if (str[0] == 'Q'){
163             int t;
164             scanf("%d", &t);
165             find(NULL, t + 1);
166             printf("%d\n", root->val);
167          }else{//修改 
168             int s, t;
169             scanf("%d%d", &s, &t);
170             if (t == 0) continue;//不动
171             int tmp = kth(root, s);//记录s当前的位置 
172             erase(root, tmp);
173             if (t == -1) insert(root, tmp - 2, s);
174             else insert(root, tmp, s);
175          }
176      }
177 }
178 
179 int main(){
180     
181     init();
182     work();
183     return 0;
184 }
View Code

 

转载于:https://www.cnblogs.com/hoskey/p/4345606.html

Unet++改进33:添加ConvolutionalGLU(2024最新改进方法)|紧凑的网络结构和高效的运算 由于残差连接的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉变形模型往往不能形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,在本文中,我们提出了聚合注意力,这是一种基于仿生设计的令牌混合器,它模拟生物中央凹视觉和连续眼运动,同时使特征映射上的每个令牌具有全局感知。此外,我们结合了可学习的令牌,与传统的查询和键交互,这进一步多样化了亲和矩阵的生成,而不仅仅依赖于查询和键之间的相似性。我们的方法不依赖于堆叠进行信息交换,从而有效地避免了深度退化,实现了自然的视觉感知。 阅读详情

相关推荐

基于ESP32-S3与PCM5102的HiFi网络收音机复刻指南:从硬件设计到软件配置

本文提供了一份详细的基于ESP32-S3与PCM5102的HiFi网络收音机复刻指南。内容涵盖从核心硬件选型(如ESP32-S3主控与PCM5102 DAC芯片)、四路独立LDO供电设计,到软件环境配置、固件烧录及常见问题调试的全过程,旨在帮助创客打造一台支持网络电台、本地播放与蓝牙连接的高保真音频播放器。

weixin_30632267的博客 184

BZOJ 题目整理

bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移、旋转、放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份翻转后的序列,直接上AC自动机即可。注意特判 1125:hash+splay 1183:digit-product只可能是2,3,5,7的积,枚举digit-product进行dp即...

weixin_30394669的博客 288

S4-FPGA-K7板级原理图硬件实战

xilinx K7板级硬件实战

weixin_66510961的博客 6148

[bzoj1861][Zjoi2006]Book书架 splay

什么是平衡树? 连验证码都算错了

Unlimited Code Works 426

薄膜比拟、开口截面扭转承载力以及风电混塔水平缝张开状态下抗扭承载力推导

风电混塔水平缝张开状态下的抗扭承载力推导,从弹性力学说起

George的博客 872

【知识分享】车载以太网PCB布局设计指南

本文将深入探讨在设计车载以太网设备的印刷电路板(PCB)时需要着重考虑的若干关键主题。这些主题广泛涵盖了数据布线设计,以确保其符合信号完整性(SI)和电磁兼容性(EMC)标准;外部元器件的合理摆放;以及采取有效的抗电磁干扰(EMI)布局策略等方面。通过全面且细致地处理这些关键环节,能够显著提升车载以太网设备的性能与可靠性。

一只豌豆象的博客 1352

bzoj1861 book书架 splay

splay裸题,快速分裂和合并就好了。 AC代码如下(自带大常数T_T): #include #include #include #define N 100005 using namespace std; int n,m,rt,c[N][2],sz[N],pos[N],a[N],fa[N]; int read(){ int x=0,fu=1; char ch=getchar(); whi

lych的博客 674

halcon第二讲:焊点提取

本文要完成的任务是将下图中焊点提取出来,对应于halcon例程Blob分析中的ball.hdev。 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) read_image (Image, 'die_03.png') disp_continue_message (WindowHandle, 'black', 'true') sto...

qq_24946843的博客 7175

【bzoj1861】[Zjoi2006]Book 书架 splay

splay的另一种应用,维护序列,不再按照权值建平衡树,而是按照下标建平衡树,然后维护一些东西。 题目大意: 1、把编号为S的书放到最上面 2、把编号为S的书放到最下面 3、把编号为S的书前移、后移或者不动 4、询问编号为S的书上面有多少本书 5、询问第S本书的编号 很朴素的平衡树,不需要维护任何东西,直接模拟就好。 记录一下编号为S的书对应的splay上的节点。 1、2、3 删

Oxer的专栏 1212

PyTorch深度学习实战(36)——Pix2Pix详解与实现

Pix2Pix 是基于生成对抗网络的图像转换框架,能够将输入图像转换为与之对应的输出图像,能够广泛用于图像到图像转换的任务,如风格转换、图像修复、语义标签到图像的转换等。Pix2Pix 的核心思想是通过对抗训练将输入图像和目标输出图像进行配对,使生成网络可以学习到输入图像到输出图像的映射关系。在本节中,将学习使用 Pix2Pix 根据给定轮廓生成图像。

盼小辉丶的博客 1万+

【数据集处理】中国地面气候资料日值数据集(V3.0)(含MATLAB全代码)

简介数据集数据处理

WW、forever的博客 1万+

BZOJ1861: [Zjoi2006]Book 书架 Splay

BZOJ1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 1302  Solved: 747 [Submit][Status][Discuss] 题解:Splay 对于两种询问操作不多说。 对于剩下的几种修改,本质上是一模一样的,首先要判断如果是Insert而且T==0那么就cont

Oakley 582

2022年全国职业院校技能大赛高职组大数据技术与应用赛项赛卷⑩—解析答案

工业互联网是工业全要素、全产业链、全价值链的全面连接,是人、机、物、工厂互联互通的新型工业生产制造服务体系,是互联网从消费领域向生产领域、从虚拟经济向实体经济拓展的核心载体,是建设现代化经济体系、实现高质量发展和塑造全球产业竞争力的关键支撑。加快发展工业互联网产业,不仅是各国顺应产业发展大势,抢占产业未来制高点的战略选择,也是我国推动制造业质量变革、效率变革和动力变革,实现高质量发展的客观要求。 为完成工业大数据分析工作,你所在的小组将应用大数据技术,以Scala作为整个项目的基础开发语言,基于大数据平台综

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 579

[BZOJ1861][Zjoi2006]Book 书架 && splay

加个build 几下每个元素在树中的位置就行了 #include #include #include #include #include #define SF scanf #define PF printf using namespace std; typedef long long LL; const int MAXN = 80000; int n, m, A[MA

shiyukun1998的专栏 576

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

BZOJ 1861 ZJOI2006 Book 书架 Splay

题目大意:……自己看懒得打了 很裸的Splay 首先开一个指针数组记录每个值代表的节点 然后就能找到某本书在序列中的什么位置了 总感觉这题可以不用Splay的说……一定是我的错觉 #include #include #include #include #define M 80800 using namespace std; struct abcd{ abcd *fa,*ls,*rs

世界 1725

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【BZOJ1861】【Zjoi2006】Book 书架 Splay

题解: 随便来一种数据结构就好啦。 这里写的是平衡树(一眼直接想到,而且发现很水) 注意。。 呃或许也不用太注意。 就是那个Insert操作要你干什么千万要看明白…… 代码: #include #include #include #include #define N 101000 #define ls son[x][0] #define rs son[x][1]

辗转山河弋流歌 1721

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

[bzoj1861][Splay]Book 书架

Description 小T有一个很大的书柜。这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列。她用1到n的正整数给每本书都编了号。 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本。由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置。不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书...

Rose_max的博客 289

BZOJ 1861 ZJOI 2006 Book 书架 Splay

题目大意:有一个书架,现在需要经常改变这些书的位置,每次询问一本书在哪或者第几本书是什么。 思路:赤裸裸的Splay,只是有些小事需要注意。因为他有的时候问你一个书在哪,这个事情不能只在Splay中就能解决,我们需要辅助他解决。注意到操作中没有加入书的操作,也就是书的总数并不会变化,而且Splay的过程中只是指针的变动,所以不会有点发生变化,所以在一开始建树的时候维护一个数组,表示这本书

(╯°口°)╯(┴—┴ 820

bzoj 1861: [Zjoi2006]Book 书架 (splay)

链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1861 题面; 1861: [Zjoi2006]Book 书架 Time Limit:4 SecMemory Limit:64 MBSubmit:2499Solved:1464[Submit][Status][Discuss] Description 小T有一...

weixin_30583563的博客 89

bzoj1861: [Zjoi2006]Book 书架 平衡树 Splay

bzoj1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜。这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列。她用1到n的正整数给每本书都编了号。 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本。由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置。不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书

maxtir的博客 273

BZOJ-1861 Book 书架 Splay

1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1010 Solved: 588 [Submit][Status][Discuss] Description 小T有一个很大的书柜。这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列。她用1到n的正整数给每本书都编了号。...

weixin_30432007的博客 70

【BZOJ 1861】[Zjoi2006]Book 书架 splay

建立一个splay维护书架的信息,开一个数组标记每一个编号对应的节点的指针就好了,没什么好说的 #include #include #include using namespace std; int n,m; struct Tree{ int x,size; Tree* ch[2],*f; Tree(int a=0,Tree* e=NULL){ x=a,size=1,ch[0]=NUL

pbihao的博客 244

splay学习小结1.1【BZOJ 1861】[Zjoi2006]Book 书架

Description有一个居住在多山岛屿的登山家,已经攀上了一座山峰,并且要攀爬另外一座更高的山峰。更精确地说,岛上的每一点都有一个大于零的海拔(海面的海拔为零),并且如果登山家位于海拔Ei的山峰上,那么他的目标是到达其他海拔为Ej(Ej>Ei)的山峰。因为登山家在一个山峰上,所以无法马上向上爬——为了到达一个海拔更高的地点,登山家需要先下山才能上山。下山的路不及上山精彩,因此,登山家想将从当前地

Marcus 436

bzoj1861 [Zjoi2006]Book 书架——splay

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1861 发现自己想splay的时候总是纠结那个点权是什么,因为splay原本是二分查找树... 但其实splay已经不是维护点权大小顺序的,它的最大作用就在于无论怎样旋转都保持着中序遍历这个相对位置不变; 所以很对应这道题,用splay进行各种操作的同时书的摆放顺序是不变的; 假设出一...

weixin_30881367的博客 141
上一篇: 【BZOJ2038】【莫队】小z的袜子
下一篇: 【BZOJ2648】【kd_tree】SJY摆棋子
Gregory99174
博客等级 码龄10年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值