P1383 高级打字机
一道非常基础的可持久化数据结构题.
前置芝士
- 可持久化线段树:实现的方法主要是主席树.
具体做法
这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个字符,撤销操作就之久回到x个版本前就好了.用主席树维护,每次修改和查询都是log2N\log_2Nlog2N的,且可以做到在线.
代码
#include<bits/stdc++.h>
#define RAP(i,first,last) for(int i=first;i<=last;++i)
//主席树标准define
#define LSON tree[now].lson
#define RSON tree[now].rson
#define MIDDLE ((left+right)>>1)
#define LEFT LSON,left,MIDDLE
#define RIGHT RSON,MIDDLE+1,right
#define NOW now_left,now_right
#define NEW_LSON tree[new_tree].lson
#define NEW_RSON tree[new_tree].rson
using namespace std;
const int maxM=1e5+7;
int N=1e5,M;
int arr[maxM],sor[maxM];
struct Tree
{int sum,lson,rson;//动态开点,因为是单点查询,所以不需要合并//习惯性得用来sum,问题不大
}tree[maxM*32];
int cnt=0;
void UpData(int &new_tree,int num,int ch,int now,int left=1,int right=N)//在now这颗树中修改,修改后的树存在new_tree中
{if(num<left||right<num)//如果不在范围内就直接用原来树的值{new_tree=now;return;}new_tree=++cnt;//新建一个节点if(left==right)//叶节点直接修改{tree[new_tree].sum=ch;return;}//修改左右子树UpData(NEW_LSON,num,ch,LEFT);UpData(NEW_RSON,num,ch,RIGHT);
}
int Query(int k,int now,int left=1,int right=N)//查询和普通的线段树差不多
{if(k<left||right<k)return 0;//不在范围内返回0if(left==right)//到叶节点就直接返回字母{return tree[now].sum;}return Query(k,LEFT)+Query(k,RIGHT);
}
int root[maxM];//记录每个版本的根节点
int len[maxM];//记录每个版本中的字符串长度
int main()
{cin>>M;char ch;int x;char add;int tot=0;//记录当前的版本编号RAP(i,1,M){cin>>ch;if(ch=='T'){++tot;cin>>add;len[tot]=len[tot-1]+1;UpData(root[tot],len[tot],add,root[tot-1]);//在上一个版本后面加上一个字母}if(ch=='U'){++tot;cin>>x;root[tot]=root[tot-x-1];//返回到x个版本前,信息只要直接赋值len[tot]=len[tot-x-1];}if(ch=='Q'){cin>>x;printf("%c\n",Query(x,root[tot]));//查询字母}}return 0;//完结撒花
}
P1383 高级打字机相关推荐
- 【Luogu】P1383高级打字机
可持久化线段树模板题之一. 权当温习主席树模板 #include<cstdio> #include<cstdlib> #include<cctype> #defin ...
- P1383 高级打字机 *
Link 主席树 思路 用 size 数组表示当前子树节点个数,新加入节点时,若 s i z e ( l c ) = = m i d − l + 1 size(lc) == mid - l + 1 s ...
- 【搜索树】高级打字机(luogu 1383)
高级打字机 luogu 1383 题目大意: 有三种操作:添加一个字符(更改操作),撤回前iii步步更改操作(更改操作,可以撤回自己),输出某一位的字符,现在要按要求输出字符 原题: 题目描述 早苗入 ...
- 高级打字机 (Tries)
Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...
- 【JZOJ3794】【洛谷P1383】高级打字机【主席树】
题目大意: 题目链接: 洛谷:https://www.luogu.org/problemnew/show/P1383 JZOJ:https://jzoj.net/senior/#main/show/3 ...
- [洛谷1383]高级打字机 题解
题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...
- 高级打字机【主席树】【滚动数组】【块状链表】
题目大意: 一个计算机支持一下三中操作: TT xx:在文章末尾打下一个小写字母xx. UU xx:撤销最后的xx次修改操作. QQ xx:询问当前文章中第xx个字母并输出. InputInput 7 ...
- Conclusion
/* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...
- 8.19noip模拟题
2017 8.19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas ...
最新文章
- P2221 [HAOI2012]高速公路
- OAM 创始团队:揭秘 OAM Kubernetes 实现核心原理
- SQL查询除了某一列的其他列
- c++ template(4)基本技巧
- Eclipse的Mockito模板
- linux华为路由器模拟器,华为路由器模拟器与实验内容.doc
- 【学习笔记】路由算法与路由协议:RIP协议与距离向量算法、OSPF协议与链路状态算法、BGP协议
- php登陆+链接+验证,php+ajax验证登录跳转登录的实现方法
- sqlserver中分组按逗号连接
- 蓝桥杯ALGO-147算法训练 4-3水仙花数
- RH850 MPU 实现介绍
- app软件怎么申请软件著作权?
- 项目管理知识体系指南(四)项目管理范围
- mysql8 update语句 where块的in方法内子查询不报错
- android bks证书生成方式
- 关于瞬时功率的无功功率和有功功率,在不同坐标系下的验证
- 网易云对象存储获取私有对象下载链接打不开的问题
- idea在mac上面操作的快捷键
- 计算机玩游戏不能全屏,电脑游戏不能全屏怎么办 电脑游戏不能全屏的解决方法...
- 如何在rhel4上禁用不需要的相关服务
热门文章
- openjudge 7920 统计单词数
- 批量缩小图片大小的方法
- batchupdate写法_mybatis执行批量插入insert和批量更新update
- mdin偏移_dif_input.c 源代码在线查看 - C8051F系列单片机开发与C语言编程 非常好的东西 资源下载 虫虫电子下载站...
- 大一网页设计期末大作业,HTML+CSS静态网站
- h5页面在新版微信iOS 端出现底部白色导航条
- 不同公司系统的对接心得
- mysql查询最轻的零件_数据库复习题
- 计算机如何回到桌面,电脑系统教程:win10怎么返回到桌面状态
- 2021年中国移动互联网行业发展现状及行业发展趋势分析[图]