题目大意:

题目链接:

洛谷:https://www.luogu.org/problemnew/show/P1383
JZOJ:https://jzoj.net/senior/#main/show/3794

要求一种数据结构满足这样的操作:

  1. TxT\ xT x:在文章末尾打下一个小写字母xxx。
  2. UxU\ xU x:撤销最后的xxx次修改操作。
  3. QxQ\ xQ x:询问当前文章中第xxx个字母并输出。

思路:

吐槽

我是不是可以去IOI了XD

这道题很显然是用主席树维护这个序列。干脆直接开一个长度为10510^5105的主席树。每一个叶子节点储存这个节点的字母。这样虽然会大大增加空间但是不会MLE啊XD
主席树的基础题吧。对于每一个TTT操作,新开一个主席树。对于每一个UUU操作,把第cnt−x−1cnt-x-1cnt−x−1个主席树抠到第cntcntcnt个主席树中。对于每一个QQQ操作,直接输出第cntcntcnt个主席树的第xxx位即可。
时间复杂度O(Tlogn)O(T\ log\ n)O(T log n),空间复杂度O(nlogn)O(n \ log\ n)O(n log n)


代码:

#include <cstdio>
#include <iostream>
using namespace std;const int N=100010;
int T,tot,sum[N],cnt,x,root[N];
char ch;struct Tree
{int ls,rs;char c;
}tree[N*20];int build(int l,int r)
{int p=++tot;if (l<r){int mid=(l+r)/2;tree[p].ls=build(l,mid);tree[p].rs=build(mid+1,r);}return p;
}int add(int now,int l,int r,int k,char val)  //插入
{int p=++tot;tree[p]=tree[now];if (l==r) tree[p].c=val;else{int mid=(l+r)/2;if (k<=mid) tree[p].ls=add(tree[now].ls,l,mid,k,val);else tree[p].rs=add(tree[now].rs,mid+1,r,k,val);}return p;
}char ask(int x,int l,int r,int k)  //询问
{if (l==k&&r==k) return tree[x].c;  //找到int mid=(l+r)/2;if (k<=mid) return ask(tree[x].ls,l,mid,k);else return ask(tree[x].rs,mid+1,r,k);
}int main()
{scanf("%d",&T);root[0]=build(1,N);while (T--){cin>>ch;if (ch=='T'){cin>>ch;cnt++;sum[cnt]=sum[cnt-1]+1;root[cnt]=add(root[cnt-1],1,N,sum[cnt],ch);}else if (ch=='U'){scanf("%d",&x);cnt++;root[cnt]=root[cnt-x-1];sum[cnt]=sum[cnt-x-1];}else{scanf("%d",&x);putchar(ask(root[cnt],1,N,x));putchar(10);}}return 0;
}

再次吐槽
JZOJ这道题可以用Pascal的滚动数组+ansistring过掉…

【JZOJ3794】【洛谷P1383】高级打字机【主席树】相关推荐

  1. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  2. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  3. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  4. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  5. 洛谷——P1047 校门外的树 python实现

    洛谷--P1047 校门外的树 python实现 l, m = map(int, input().split(' ')) trees = [True]*(l+1) for i in range(m): ...

  6. 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)

    传送门 我们可以进行离线处理,把每一个情报员的权值设为它开始收集情报的时间 那么设询问的时间为$t$,就是问路径上有多少个情报员的权值小于等于$t-c-1$ 这个只要用主席树上树就可以解决了,顺便用树 ...

  7. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  8. 洛谷(P3373)线段树加乘混合模板

    题目链接:P3373 [模板]线段树 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题目的意思很明确,就是要我们在线完成区间的乘和加运算并支持查询区间和的一个问题.处理这道 ...

  9. 洛谷题解——P1873:砍树

    视频讲解可以直接点击这个 B 站链接,https://www.bilibili.com/video/BV1jk4y1k7hq/. 题目相关 题目链接 洛谷,https://www.luogu.com. ...

最新文章

  1. Java中泛型的各种使用
  2. SQL点滴20—T-SQL中的排名函数
  3. Git之常用的高效处理技巧
  4. npm包管理器安装模块
  5. css常用单位px、em、 rem 区别与各自的用法解析
  6. 进退两难的硅谷程序员们
  7. 九大CTO畅谈软件定义未来
  8. 计算机组成原理-白中英版
  9. rk3399调试ov2659(camera模块@dvp接口)--源码分析
  10. 手机如何登录企业邮箱,公司电子邮箱登录页面
  11. 77 关于 java.util.concurrent.RejectedExecutionException:Thread limit exceeded replacing blocked worker
  12. 清华大学杨殿阁 深度解读《汽车数据安全管理若干规定(征求意见稿)》
  13. 802.11a/b/g/n区别
  14. 谈谈 跨境劳工的噩梦深坑。
  15. ss-libev 分析
  16. Oracle怎么查hex值,oracle 进制转换 HEX/DECIMAL/OCTAL/BINARY
  17. airpods pro是按压还是触摸_苹果三代耳机是触摸还是按键
  18. 小码农也有大梦想!java编译环境是什么意思
  19. 戴尔电脑无法启动,显示致命错误C00000D4正在应用更新操作
  20. openwrt/linux路由器访客网络禁止访问WebUI但可以访问外网功能实现

热门文章

  1. 《Spring Cloud微服务架构实战派》PDF样章
  2. 哈工大计算机网络考研题,哈工大计算机考研历年复试试题(完全版).PDF
  3. python基础教程:python+OpenCV实现车牌号码识别
  4. 5月28-29日规模化敏捷联合作战沙盘之乌托邦计划—成都站
  5. 计算机无法识别打印机驱动,打印机连电脑,电脑说无法识别。为什么?
  6. Zabbix Trapper items
  7. MATLAB experiment<3>
  8. Springboot美容院管理系统33877计算机毕业设计-课程设计-期末作业-毕设程序代做
  9. 电子计算机奏出美妙的交响改为把字句,北师大版三年级下册语文的期中试卷
  10. 阿里C/C++面试题