高级打字机

题目链接 https://www.luogu.org/problemnew/show/P1383

背景

无聊中。。

随便在luogu上rand到了一道题

从此走上不归路

主席树是我暑假的时候学的

现在真的忘得精光

花了一个小时从零开始学

看来之前学过的东西还是要好好巩固啊

思路

首先50分超级好拿

纯粹的模拟就可以了

首先看到‘撤销’联想到‘历史版本’,于是就想到可以用主席树来支持这种撤销。

那主席树应该维护什么呢?

当然是维护输入的字符序列

由于一次更改肯定是基于上一次更改

所以和上一次有很多点是可以共用的

所以可以用可持久化数据结构

不过不同的是

由于序列的长度时增时减

所以我们需要一开始就把空间开足

然后这道题的读入也是一个坑点

YCB大佬亲自指导本菜鸡改读入(我还不会%c)教了我一种类似读入优化的读入一个字符的方法,比%c快(再也不用%c了)。

代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#define rg register int
#define ll long long
#define RG register
#define il inline
using namespace std; il int gi()
{
rg x=0,o=0;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||'9'<ch)) ch=getchar();
if(ch=='-') o=1,ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return o?-x:x;
} char ch,opt;int n; #define SZ 100010 struct Tree { int l,r;char ch; }tr[SZ*25];
#define lson tr[rt].l
#define rson tr[rt].r
int Ed[SZ],tot,cnt;
// 主席树存什么? 每一个点的 字符
// 为什么不需要建树? 因为一开始是空的所以不需要建树,肯定不会跟空的共用节点 void update(int &rt,rg last,rg l,rg r,rg pos)
{
rt=++tot;
if(l==r) {tr[rt].ch=ch;return;}
lson=tr[last].l;rson=tr[last].r;
rg mid=l+r>>1;
if(pos<=mid) update(lson,tr[last].l,l,mid,pos);
else update(rson,tr[last].r,mid+1,r,pos);
} char query(rg rt,rg l,rg r,rg pos)
{
if(l==r) return tr[rt].ch;
rg mid=l+r>>1;
if(pos<=mid) return query(lson,l,mid,pos);
else return query(rson,mid+1,r,pos);
} int len[SZ];
int main()
{
n=gi();
while(n--)
{
opt=getchar();
while(opt!='T' && opt!='U' &&opt!='Q')opt = getchar();
if(opt=='T')
{
ch=getchar();
while(!('a'<=ch&&ch<='z')) ch=getchar(); // 把空格吃掉
len[++cnt]=len[cnt-1]+1;
update(Ed[cnt],Ed[cnt-1],1,SZ,len[cnt]);
}
if(opt=='U')
{
rg x=gi();
len[++cnt]=len[cnt-x-1];
Ed[cnt]=Ed[cnt-x-1]; // 还要 -1 想想为什么
}
if(opt=='Q')
{
rg x=gi();
printf("%c\n",query(Ed[cnt],1,SZ,x));
}
}
return 0;
}

(luogu P1383)高级打字机的更多相关文章

  1. 「Luogu P1383 高级打字机」

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

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

    2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...

  3. P1383 高级打字机

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

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

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

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

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

  6. 【Luogu】P1383高级打字机

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

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

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

  8. C++之路进阶——codevs3333(高级打字机)

    3333 高级打字机  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master     题目描述 Description 早苗入手了最新的高级打字机.最新款自然有着与 ...

  9. [模拟赛] T1 高级打字机

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

随机推荐

  1. ECS的配置与使用

    登录阿里云ECS,系统是centos7.2 在linux下通过useradd方式创建新用户,切换到该用户权限,发现-bash-4.2$ . 解决方法:先查看进程,关闭相关进程.然后使用useradd ...

  2. 在 Mac 中安装 MySQLdb (Python mysql )

    安装环境:OS X操作系统,Python 2.7.3. MySQLdb其实包含在MySQL-python包中,因此无论下载还是在pip中search,都应该是搜寻MySQL-python. 以下将说明 ...

  3. LINUX服务器下用root登录ftp

    因为安全方面的原因,root用户是默认不能登录ftp服务的. 如果一定要用root登录,则: 1.删除或注释/etc/vsftpd.ftpusers中的root 2.删除或注释/etc/vsftpd. ...

  4. CentOS 7 使用iptables防火墙

    # 停止firewalld服务 systemctl stop firewalld systemctl mask firewalld # 安装iptables-services yum install ...

  5. dedecms文章页调用上一篇和下一篇文章

    dedecms文章页调用上一篇和下一篇文章,解析后是链接形式的上下篇 {dede:prenext get='pre'/} {dede:prenext get='next'/}

  6. RMI远程服务调用

    数据库:info.sql /* Navicat MySQL Data Transfer Source Server : yuanzhen Source Server Version : 50713 S ...

  7. LeetCode第五天

    leetcode 第五天 2018年1月6日 22.(566) Reshape the Matrix JAVA class Solution { public int[][] matrixReshap ...

  8. java网络编程(3)——UDP

    UDP在java中主要使用DatagramSocket来实现通讯,数据一般是通过DatagramPacket来封装: 发送方只需指定接受方的地址和端口,然后通过send()方法就可以把封装在Datag ...

  9. Shell 脚本实践

    1. 脚本判断命令输出是否为空 (1)判断字符串为空 if [ "$str" =  "" ]  if [ x"$str" = x ] if ...

  10. Action调用Service

    Java Web项目,写到Action的时候,往往会要引入Service,这个是一个常见的操作. 但是,我自认为引入Service需要给它get和set方法,并且这个习惯已经沿用到现在.然而,自从参与 ...