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. pip国内镜像,提升下载速度和安装成功率

    对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成 ...

  2. 关于MVC WebAPI 中加入任务调度功能的问题 (MVC WebAPI 任务调度)

    在MVC WebAPI中加入任务调度功能.即在MVC WebAPI启动时,启用任务调度程序. 但是这里有一个问题点,就是部署好IIS站点后,发现任务调度并没有启用.原因为何? 原因是部署好IIS站点后 ...

  3. RestTemplate踩坑 之 ContentType 自动添加字符集

    写在前边 最近在写 OAuth2 对接的代码,由于授权服务器(竹云BambooCloud IAM)部署在甲方内网,所以想着自己 Mock 一下授权方的返回体,验证一下我的代码.我这才踩到了坑-- 故事 ...

  4. systemd --user进程CPU占用高问题分析

    1.问题由来 近期发现堡垒机环境有如下问题,systemd占用大量cpu: 原文链接:https://www.cnblogs.com/yaohong/p/16046670.html 2.问题定位 2. ...

  5. Nacos 使用

    Nacos(一)-下载安装 https://blog.csdn.net/qq_21067307/article/details/103895607  转载                        ...

  6. Intellij IDEA实现SpringBoot项目多端口启动的两种方法

    有时候使用springboot项目时遇到这样一种情况,用一个项目需要复制很多遍进行测试,除了端口号不同以外,没有任何不同.遇到这种情况怎么办呢?这时候可以使用Intellij IDEA解决 前言 有时 ...

  7. java反射 java动态代理和cglib动态代理的区别

    java反射      https://blog.csdn.net/f2764052703/article/details/89311013 java 动态代理   https://blog.csdn ...

  8. Mybatis的XML文件调用静态方法

    如果需要在Mapper文件中调用静态方法,需要 <choose> // 需要静态方法返回true还是false <when test="@staticClass@stati ...

  9. GC 是什么?为什么要有 GC?

    GC 是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误 的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动 监测对象是否超过作用域从而达到自动回收内存 ...

  10. 查看mysql相关信息

    查看本机mysql的相关信息,执行以下SQL即可: SHOW VARIABLES LIKE "%char%";