2021.07.02 P1383 高级打字机题解(可持久化平衡树)

分析:

从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集),正好练习一下可持久化平衡树。

可持久化平衡树:

如果还没学过可持久化平衡树,那就先去学一下吧~

从fhq treap开始:

https://blog.csdn.net/CABI_ZGX/article/details/79963427

[总结] fhq_Treap 学习笔记 - YoungNeal - 博客园 (cnblogs.com)

进入可持久化时代:

题解 P5055 【【模板】可持久化文艺平衡树】 - KevinYu 的博客 - 洛谷博客 (luogu.com.cn)

平衡树练习题:

正常的平衡树:

P3369 【模板】普通平衡树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P3391 【模板】文艺平衡树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

CF702F T-Shirts - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

可持久化平衡树:

P3835 【模板】可持久化平衡树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P5055 【模板】可持久化文艺平衡树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

步入正题:

温馨提示:一定要舍得开空间,把空间开大些。几乎就是版子~

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
const int N=1e5+10;
int n,root[N],cnt,top;
struct node{
int l,r,size,rd;
char val;
}t[N<<5];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
void update(int x){
t[x].size=t[t[x].l].size+t[t[x].r].size+1;
}
int newnode(char ch){
++cnt;
t[cnt].l=t[cnt].r=0;
t[cnt].size=1;t[cnt].rd=rand();
t[cnt].val=ch;
return cnt;
}
int copy(int x){
++cnt;
t[cnt]=t[x];
return cnt;
}
int merge(int x,int y){
if(!x||!y)return x+y;
else{
if(t[x].rd>t[y].rd){
t[x].r=merge(t[x].r,y);
update(x);
return x;
}else{
t[y].l=merge(x,t[y].l);
update(y);
return y;
}
}
}
void split(int rt,int k,int &x,int &y){
if(!rt)x=y=0;
else{
if(t[t[rt].l].size<k){
x=copy(rt);
split(t[x].r,k-t[t[rt].l].size-1,t[x].r,y);
update(x);
}else{
y=copy(rt);
split(t[y].l,k,x,t[y].l);
update(y);
}
}
}
void query(int &rt,int pos){
int r1,r2,r3;
split(rt,pos,r1,r3);
split(r1,pos-1,r1,r2);
cout<<t[r2].val<<endl;
rt=merge(merge(r1,r2),r3);
}
void insert(int &rt,int pos,char x,int &rti){
int r1,r2;
split(rt,pos,r1,r2);
int xi=newnode(x);
rti=merge(merge(r1,xi),r2);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
string s;
cin>>s;
if(s[0]=='T'){
string x;
cin>>x;
int pos=t[root[top]].size,topi=top+1;
insert(root[top],pos,x[0],root[topi]);
++top;
}else if(s[0]=='U'){
int x;
cin>>x;
root[top+1]=root[top-x];
++top;
}else if(s[0]=='Q'){
int x;
cin>>x;
query(root[top],x);
}
}
return 0;
}
//7 T A U 1 T B T C Q 2 U 1 Q 1

2021.07.02 P1383 高级打字机题解(可持久化平衡树)的更多相关文章

  1. 洛谷 P1383 高级打字机==codevs 3333 高级打字机

    P1383 高级打字机 18通过 118提交 题目提供者yeszy 标签倍增图论高级数据结构福建省历届夏令营 难度省选/NOI- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目描述 早苗入手 ...

  2. 2021.07.02 UVa1197 多路归并模板

    2021.07.02 UVa1197 多路归并模板 UVA11997 K Smallest Sums - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 分析: 题解 UVA11997 ...

  3. P1383 高级打字机

    P1383 高级打字机 主席树 一发主席树解决. 插入操作十分显然. 撤销操作复制前面的版本就行. 询问操作十分显然. #include<iostream> #include<cst ...

  4. (luogu P1383)高级打字机

    高级打字机 题目链接 https://www.luogu.org/problemnew/show/P1383 背景 无聊中.. 随便在luogu上rand到了一道题 从此走上不归路 主席树是我暑假的时 ...

  5. 【洛谷P1383 高级打字机】

    题目描述 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(t ...

  6. 【Luogu】P1383高级打字机

    可持久化线段树模板题之一. 权当温习主席树模板 #include<cstdio> #include<cstdlib> #include<cctype> #defin ...

  7. 「Luogu P1383 高级打字机」

    一道非常基础的可持久化数据结构题. 前置芝士 可持久化线段树:实现的方法主要是主席树. 具体做法 这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个 ...

  8. 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)

    2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...

  9. 洛谷 P1383 codevs 3333 高级打字机

    题目描述 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(t ...

随机推荐

  1. 6月6日 python学习总结 jQuery (三)

    1. 常用事件 1. hover #鼠标悬停监听 2. keydown和keyup #键盘按键 按下/抬起 3. change #监听值的改变 全部输入完失去焦点后 4. focus和blur # 获 ...

  2. Java案例——日期工具类

    需求:定义一个日期工具类,包含两个方法,按日期转化成指定格式的字符串,把字符串解析为指定格式的日期 然后定义一个测试类测试 分析: 1.定义一个日期工具类 2.定义一个方法dateToString,用 ...

  3. CodeForces Round #760 (Div. 3)

    A. Polycarp and Sums of Subsequences 题目大意: 给七个不降序的数字,为三个数组合后得到的七种答案,求原来的三个数是哪些 思路: 由样例不难发现,第一个一定是三个数 ...

  4. 【仿真】Carla之收集数据快速教程 (附完整代码) [7]

    收集过程可视化展示,随后进入正文: 参考与前言 看到仿真群对这类任务下(用carla收集数据然后再做训练等) 需求量大,顺手马上写一个好了,首先收集数据需要考虑清楚: 收集什么数据,需要什么样的数据格 ...

  5. java中会存在内存泄漏吗,请简单描述?

    所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中.java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉.由于Jav ...

  6. Hadoop的安装配置(一)

    一.Hadoop的安装①Hadoop运行的前提是本机已经安装了JDK,配置JAVA_HOME变量②在Hadoop中启动多种不同类型的进程        例如NN,DN,RM,NM,这些进程需要进行通信 ...

  7. nginx使用与配置

    一.nginx操作命令 nginx常用命令: 验证配置是否正确: nginx -t 查看Nginx的版本号:nginx -V 启动Nginx:start nginx 重新加载nginx:nginx.e ...

  8. mybatis-数据库类型的对应关系

  9. Serlvet 输出中文

    1 response.setHeader("Content-type", "text/html;charset=UTF-8"); 2 response.setC ...

  10. Java 中能创建 volatile 数组吗?

    能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不 是整个数组.我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护, 但是如果多个线程同时改变数 ...