高级打字机

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

背景

无聊中。。

随便在luogu上rand到了一道题

从此走上不归路

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

现在真的忘得精光

花了一个小时从零开始学

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

思路

首先50分超级好拿

纯粹的模拟就可以了

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

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

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

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

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

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

不过不同的是

由于序列的长度时增时减

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

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

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

代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <queue>
  7. #define rg register int
  8. #define ll long long
  9. #define RG register
  10. #define il inline
  11. using namespace std;
  12. il int gi()
  13. {
  14. rg x=0,o=0;RG char ch=getchar();
  15. while(ch!='-'&&(ch<'0'||'9'<ch)) ch=getchar();
  16. if(ch=='-') o=1,ch=getchar();
  17. while('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  18. return o?-x:x;
  19. }
  20. char ch,opt;int n;
  21. #define SZ 100010
  22. struct Tree { int l,r;char ch; }tr[SZ*25];
  23. #define lson tr[rt].l
  24. #define rson tr[rt].r
  25. int Ed[SZ],tot,cnt;
  26. // 主席树存什么? 每一个点的 字符
  27. // 为什么不需要建树? 因为一开始是空的所以不需要建树,肯定不会跟空的共用节点
  28. void update(int &rt,rg last,rg l,rg r,rg pos)
  29. {
  30. rt=++tot;
  31. if(l==r) {tr[rt].ch=ch;return;}
  32. lson=tr[last].l;rson=tr[last].r;
  33. rg mid=l+r>>1;
  34. if(pos<=mid) update(lson,tr[last].l,l,mid,pos);
  35. else update(rson,tr[last].r,mid+1,r,pos);
  36. }
  37. char query(rg rt,rg l,rg r,rg pos)
  38. {
  39. if(l==r) return tr[rt].ch;
  40. rg mid=l+r>>1;
  41. if(pos<=mid) return query(lson,l,mid,pos);
  42. else return query(rson,mid+1,r,pos);
  43. }
  44. int len[SZ];
  45. int main()
  46. {
  47. n=gi();
  48. while(n--)
  49. {
  50. opt=getchar();
  51. while(opt!='T' && opt!='U' &&opt!='Q')opt = getchar();
  52. if(opt=='T')
  53. {
  54. ch=getchar();
  55. while(!('a'<=ch&&ch<='z')) ch=getchar(); // 把空格吃掉
  56. len[++cnt]=len[cnt-1]+1;
  57. update(Ed[cnt],Ed[cnt-1],1,SZ,len[cnt]);
  58. }
  59. if(opt=='U')
  60. {
  61. rg x=gi();
  62. len[++cnt]=len[cnt-x-1];
  63. Ed[cnt]=Ed[cnt-x-1]; // 还要 -1 想想为什么
  64. }
  65. if(opt=='Q')
  66. {
  67. rg x=gi();
  68. printf("%c\n",query(Ed[cnt],1,SZ,x));
  69. }
  70. }
  71. return 0;
  72. }

(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. prop&attr区别和用法,以多选框为例

    1.比较 相同点 : prop和attr作为jquery的方法都可以获取属性值; 不同点 : (1) 对于HTML元素本身就带有的固有属性,使用prop方法, attr获取checkbox的check ...

  2. CentOS7上LNMP安装包一步搭建LNMP环境

    系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian Linux系统 需要5GB以上硬盘剩余空间 需要128MB以上内存(如果为128MB的小内存VPS,Xe ...

  3. 上帝之眼APP——实时定位监控、即时通讯

    项目地址 https://github.com/guoyaohua/GodsEYE 开发环境 Android studio 2.3.1 极光推送IM SDK 百度鹰眼SDK 背景介绍 定位监控系统,不 ...

  4. 深刻理解iosBlock

    深刻理解iosBlock ///一个控制器里的方法 - (void)setRefreshHeader { ACWeakSelf(self); self.tableView.mj_header = [M ...

  5. 网络基础tcp/ip协议三

    数据链路层:(位于网络层与物理层之间) 数据链路层的功能: 数据链路的建立,维护. 帧包装,帧传输,帧同步. 帧的差错恢复. 流量的控制. 以太网:(工作在数据链路层) CSMA/CD(带冲突检测的载 ...

  6. 使用mongoVUE删除大量数据的情况下失效问题

    昨天有一个系统出现了问题,导致半夜时大量的错误数据产生,早晨一早接到上边通知让把这些数据尽数删除. 不可否认在数据操作时mongoVUE更加直观,因此一般情况下我也都是使用这个工具,但是今天却出现了问 ...

  7. Ubutu Chrome 出现adobe flash is out of date的解决方法

    我们需要到官网下载flash player,网址:https://get.adobe.com/flashplayer/ 不过这里要说明一下: 一般的浏览器使用的是npapi,即adobe flash ...

  8. Android项目中的各个模块框架设计

    作为Android开发,现对项目开发中的各个模块搭建,梳理如下: Android UI框架,开发人员需要达到专家级 网络框架 浏览框架 图片加载框架 图片裁剪压缩工具类 客户端并发框架 线程池设计 ( ...

  9. JSP标签c:forEach报错(二)

    1.今天,我在用c标签写一些样例,结果出现一些错误,写下作为记录 具体错误如下: 三月 31, 2014 9:46:28 下午 org.apache.catalina.core.StandardWra ...

  10. Java中的List转换成JSON报错(五)

    1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/beanu ...