高级打字机

题目链接 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. Netty的常用概念

    我们先来看一段代码: // Configure the server. EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGr ...

  2. CEF小白人系列1-认识CEF

    手头上有个项目需要做浏览器的相关功能,评估了几个嵌入式方案最后选定CEF作为开发基础. 在入坑新技术的时候第一选择是去官网学习,这是一个非常好的习惯. CEF官网(请科学上网) https://bit ...

  3. redux middleware 源码分析

    原文链接 middleware 的由来 在业务中需要打印每一个 action 信息来调试,又或者希望 dispatch 或 reducer 拥有异步请求的功能.面对这些场景时,一个个修改 dispat ...

  4. 《HelloGitHub》第 23 期

    公告 新的一年,不忘初心,从新开始.加油! <HelloGitHub>第 23 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的 ...

  5. bzoj 2288 【POJ Challenge】生日礼物 双向链表+堆优化

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1003  Solved: 317[Submit][ ...

  6. 在 ASP.NET Core 项目中实现小写的路由URL

    在 ASP.NET MVC 早期版本中,我们可以通过在应用的 RegisterRoutes 方法中设置 routes.LowercaseUrls = true ; 来将页面的 URL 链接转小写.在 ...

  7. linux云计算(keystone swift cinder配置)

    独立安装openstack组件 准备服务器,为安装openstack的服务器加3块额外硬盘 qemu-img create -f qcow2 rh71.img 20G qemu-img create ...

  8. Java中的Lock与synchronized

    并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...

  9. 1.2 PCI总线的信号定义

    PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备.这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号.控制信号.仲裁信号.中断信号等多种信号组成. PCI总线是一 ...

  10. Davinci DM6446开发攻略——u-boot-1.3.4移植(1)

    UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM开发包里的UBOOT是1.2.0版本,国内很多公司还一直使用u-boot-1.1.4和 ...