2021.07.02 P1383 高级打字机题解(可持久化平衡树)
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 高级打字机题解(可持久化平衡树)的更多相关文章
- 洛谷 P1383 高级打字机==codevs 3333 高级打字机
P1383 高级打字机 18通过 118提交 题目提供者yeszy 标签倍增图论高级数据结构福建省历届夏令营 难度省选/NOI- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目描述 早苗入手 ...
- 2021.07.02 UVa1197 多路归并模板
2021.07.02 UVa1197 多路归并模板 UVA11997 K Smallest Sums - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 分析: 题解 UVA11997 ...
- P1383 高级打字机
P1383 高级打字机 主席树 一发主席树解决. 插入操作十分显然. 撤销操作复制前面的版本就行. 询问操作十分显然. #include<iostream> #include<cst ...
- (luogu P1383)高级打字机
高级打字机 题目链接 https://www.luogu.org/problemnew/show/P1383 背景 无聊中.. 随便在luogu上rand到了一道题 从此走上不归路 主席树是我暑假的时 ...
- 【洛谷P1383 高级打字机】
题目描述 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(t ...
- 【Luogu】P1383高级打字机
可持久化线段树模板题之一. 权当温习主席树模板 #include<cstdio> #include<cstdlib> #include<cctype> #defin ...
- 「Luogu P1383 高级打字机」
一道非常基础的可持久化数据结构题. 前置芝士 可持久化线段树:实现的方法主要是主席树. 具体做法 这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个 ...
- 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)
2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...
- 洛谷 P1383 codevs 3333 高级打字机
题目描述 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(t ...
随机推荐
- (leetcode)二叉树的层次遍历-c语言实现
这段代码,在后面跑测试用例时,出现了stack-overflow,但是原因还不清楚. 问题如下: 二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点) ...
- fastcgi未授权访问及任意命令执行
1. 漏洞原理 服务端使用fastcgi协议并对外网开放9000端口,攻击者可以构造fastcgi协议包内容,实现未授权访问服务端.php文件以及执行任意命令. 2. 漏洞利用 第一步 搭建vulhu ...
- python练习册 每天一个小程序 第0009题
1 ''' 2 题目描述: 3 找出一个html文件中所有的url 4 5 思路 : 6 利用正则表达式进行匹配 7 8 ''' 9 10 11 import re 12 13 14 with ope ...
- Ubuntu修改登录密码
Ubuntu 修改用户名或密码后无法登陆 解决方法 2017年09月01日 16:48:05 lee_3312 阅读数:2192 解决方法:进入recovery-mode修改登录信息 1)重启系统 ...
- mac phpStrom 卸载
cd ~/Library/Logs/cd ~/Library/Application\ Supportcd ~/Library/Preferences/cd ~/Library/Caches/
- django中动态新建postgres数据库表
import psycopg2def create_new_table(table_id): conn = psycopg2.connect(database='Test', user='postgr ...
- C语言break,return
C语言break,continue,return的相似与区别 相同点: 都改变了程序的执行流程 区别是:break 用于循环和switch分支,跳出它所在分支或循环体到它所在的模块的 ...
- 4.1 ROS元功能包
4.1 ROS元功能包 场景:完成ROS中一个系统性的功能,可能涉及到多个功能包,比如实现了机器人导航模块,该模块下有地图.定位.路径规划...等不同的子级功能包.那么调用者安装该模块时,需要逐一的安 ...
- carsim的一些注意事项
1.carsim导入simulink中运行的目录下最好有simfile.sim文件,可以再carsim_2016.1_date中找到(文件夹内最下端) 2.carsim导入simulink中如果显示下 ...
- 一份你可以在 <head> 里设置的列表
A list of everything that could go in the <head> of your document github 原地址:https://github.co ...