可持久化杀手——rope学习笔记
概述
std::rope
,内部一说是可持久化平衡树,一说是块状链表。
它可以实现很多可持久化数组问题。
基本使用
#include<bits/extc++.h>
using namespace __gnu_cxx; // 引入rope
rope<char> a; //建立一个存储char的rope
crope a; //crope实际上就是rope<char>
a.push_back('Y'); //在rope尾部新增一个元素
a[1]; // 获得 1 处元素
a.at(1); // 实际上就是 a[1]
rope<char> b=a; // 赋值
我们可以使用rope数组来实现可持久化数组。
P1383 高级打字机
早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。
请为这种高级打字机设计一个程序,支持如下 \(3\) 种操作:
1.T x
:在文章末尾打下一个小写字母 \(x\)。(type 操作 )
2.U x
:撤销最后的 \(x\) 次修改操作。(Undo 操作)
(注意 Query 操作并不算修改操作)
Q x
:询问当前文章中第 \(x\) 个字母并输出。(Query 操作)
文章一开始可以视为空串。
对于 \(100\%\) 的数据 \(n \le 100000\);保证 Undo 操作不会撤销 Undo 操作。
这道题正解主席树,当然也可以rope。
代码如下:
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_cxx;
const int N = 100000;
int cnt=-1,n;
crope *now[N];
char op,ch;int num;
int main(){
cin>>n;
now[++cnt]=new crope();
for(int i=1;i<=n;i++){
cin>>op;
if(op=='T'){
cin>>ch;
cnt++;
now[cnt]=new crope(*now[cnt-1]); //new version
now[cnt]->push_back(ch);
}
if(op=='U'){
cin>>num;
cnt++;
now[cnt]=new crope(*now[cnt-num-1]);
}
if(op=='Q'){
cin>>num;
cout<<now[cnt]->at(num-1)<<'\n';
}
}
return 0;
}
P6166 [IOI2012] scrivener
有些人说李奥纳多是一个对于 Johannes Gutenberg 的崇拜者,Johannes 是一个发明活字印刷的德国铁匠,为了表达尊敬,李奥纳多设计了一台机器被称为小龙虾代书,那是一个非常简单的打字设备。这机器就像一部简单的现代打字机,但只能接受两个指令。一个指令是 输出一个字符,另一个指令是取消最近的指令。小龙虾代书的最大特点就是拥有这个功能强大的取消指令。因为一个取消指令本身也是一个指令,所以也可以被取消。
你的任务是作出此小龙虾代书的程序,一开始并无输出任何文字,然后开始接受使用者输入的一连串指令,并可查询目前输出文字中的特定位置的字符。详细说明如下:
TypeLetter(L)
—附加一个小写字母L在输出文字的最后,\(L\) 可以是 \(a,b,\cdots, z\)。UndoCommands(U)
— 取消之前的 \(U\) 个指令,\(U\) 是一个正整数。GetLetter(P)
— 回传在输出文字中位置为 \(P\) 的字符,\(P\) 是一个非负整数。 输出文字中的第一个字符的位置为 \(0\)。 (这个查询并不是一个指令,因此会被取消指令忽略。)
三种操作可以依照任何顺序被呼叫 \(0\) 次或多次以上。
指令 UndoCommands(U)
会依照原本执行的相反顺序来取消前面 \(U\) 个指令: 如果被取消的指令是 TypeLetter(L)
,就会从输出文字最后面移除字母 \(L\)。如果被取消的指令是 UndoCommands(X)
,那么将会依照原本执行的顺序重新执行之前被取消的 \(X\) 个指令。
对于 \(100\%\) 的数据,\(1 \le N \le 10^6\)。参数 \(U\) 保证不会超过前面已经输入的指令数目,而且参数 \(P\) 一定小于输出文字的长度(也就是输出文字的字母数)。
这道题跟上一题差不多。
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_cxx;
const int N = 1e6+5;
int cnt,q;
crope now[N];
char op,ch;int num;
int main(){
cin>>q;
while(q--){
cin>>op;
if(op=='P'){
cin>>num;
cout<<now[cnt][num]<<'\n';
}
if(op=='T'){
cnt++;
cin>>ch;
now[cnt]=now[cnt-1];
now[cnt].append(ch);
}
if(op=='U'){
cnt++;
cin>>num;
now[cnt]=now[cnt-num-1];
}
}
return 0;
}
可持久化杀手——rope学习笔记的更多相关文章
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树
可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...
- Android:日常学习笔记(9)———探究持久化技术
Android:日常学习笔记(9)———探究持久化技术 引入持久化技术 什么是持久化技术 持久化技术就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失 ...
- tensorflow学习笔记——模型持久化的原理,将CKPT转为pb文件,使用pb模型预测
由题目就可以看出,本节内容分为三部分,第一部分就是如何将训练好的模型持久化,并学习模型持久化的原理,第二部分就是如何将CKPT转化为pb文件,第三部分就是如何使用pb模型进行预测. 一,模型持久化 为 ...
- Redis学习笔记六:持久化实验(AOF,RDB)
作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...
- Adaptive AUTOSAR 学习笔记 15 - 持久化 Persistency
本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf.作者:Zijian/TENG 原文地 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- SQLite学习笔记(七)&&事务处理
说到事务一定会提到ACID,所谓事务的原子性,一致性,隔离性和持久性.对于一个数据库而言,通常通过并发控制和故障恢复手段来保证事务在正常和异常情况下的ACID特性.sqlite也不例外,虽然简单,依然 ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
随机推荐
- Vue学习之--------消息订阅和发布、基础知识和实战应用(2022/8/24)
文章目录 1.基础知识 2.代码实例 2.1 main.js 2.2 School.vue 2.3 Student.vue 2.4 App.vue 3.全局事件总线通信改为消息的订阅和发布 3.1 核 ...
- 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...
- HDFS基础学习
HDFS简介 HDFS即Hadoop Distributed File System,是一个分布式文件系统,用于存储海量数据.一个HDFS集群由一个NameNode和多个DataNode组成. HDF ...
- 部署redis-cluster
1.环境准备 ☆ 每个Redis 节点采用相同的相同的Redis版本.相同的密码.硬件配置 ☆ 所有Redis服务器必须没有任何数据 #所有主从节点执行: [root@ubuntu2004 ~]#ba ...
- python进阶(26)collections标准库
前言 这个模块实现了特定目标的容器,以提供Python标准内建容器dict ,list ,set , 和tuple 的替代选择. 这个模块提供了以下几个函数 函数 作用 namedtuple() 创建 ...
- 更改安装Oracle数据库时设定的System sys等用户的密码
因本地Oracle数据库安装久远,不知道连接账号密码,查阅了一些资料最终修改成功,Mark up! 1 在开始菜单找到Oracle服务,打开SQL plus 2 输入命令连接到数据库并修改部分用户密码 ...
- 图学习【参考资料2】-知识补充与node2vec代码注解
本项目参考: https://aistudio.baidu.com/aistudio/projectdetail/5012408?contributionType=1 *一.正题篇:DeepWalk. ...
- Python用yield form 实现异步协程爬虫
很古老的用法了,现在大多用的aiohttp库实现,这篇记录仅仅用做个人的协程底层实现的学习. 争取用看得懂的字来描述问题. 1.什么是yield 如果还没有怎么用过的话,直接把yield看做成一种特殊 ...
- 2022春每日一题:Day 30
题目:[JSOI2009]电子字典 读完题后,暴力?确实,计算一下时间复杂度最坏情况下,20263*10000=1.5e8,卡一下常可以直接卡到7e7,最严格来说应该卡的过去,但是此题数据可以直接卡过 ...
- 2022春每日一题:Day 17
今天打CF去了,但是很菜,只做了三题.赛后一分钟做出了第四题,wa了,改了一下下,过了 第一题就是对应的小写字母在大写字母前出现. 第二题直接dfs. 第三题dp,f[i][j]表示以第i个数开始加了 ...