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. 一图学Python

    网上有这样一张图片,信息量很大,通常会被配上标题"一张图让你学会Python": 这张图流传甚广,但我没有找到明确的出处,图片上附带了 UliPad 的作者 Limodou 的信息 ...

  2. SpringBoot:自定义注解实现后台接收Json参数

    0.需求 在实际的开发过程中,服务间调用一般使用Json传参的模式,SpringBoot项目无法使用@RequestParam接收Json传参 只有@RequestBody支持Json,但是每次为了一 ...

  3. mysql主从异步复制过程

    mysql是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失.为了保证mysql数据库的可靠性.就要会一些提高可靠性的技术. 主从复制原理如下. slave(从服务器) master(主服务器) ...

  4. java面试-四维图新

    1.给出至少三种排序方式,并写出详细实现思路. /** * 快速排序 * @param arr * @param low * @param high */ public static void qui ...

  5. 为什么使用 Executor 框架?

    每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗时. 耗资源的. 调用 new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建, 线程之间的相互 ...

  6. MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如 何保证 redis 中的数据都是热点数据?

    Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略. 相关知识:Redis 提供 6 种数据淘汰策略: volatile-lru:从已设置过期时间的数据集(server.db[i]. ...

  7. (转载)JSON对象使用变量作为键名

    转载链接:https://blog.csdn.net/lihefei_coder/article/details/82499520 //第一种方式 var key = 'name'; var json ...

  8. 处理器映射器(HandlerMapping)及处理器适配器(HandlerAdapter)详解(二)

    注解的 处理器映射器 和 处理器适配器 介绍 注解的映射器: 在 Spring3.1 之前使用 DefaultAnnotationHandlerMapping 注解映射器(根据 DispatcherS ...

  9. 剑指Offer30——包含min函数的栈

    剑指Offer30--包含min函数的栈 1. 题目简述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min.push及pop的时间复杂度是O(1). 2. 题 ...

  10. matlab中fmincon函数求解非线性规划问题

    Matlab求解非线性规划,fmincon函数的用法总结 1.简介 在matlab中,fmincon函数可以求解带约束的非线性多变量函数(Constrained nonlinear multivari ...