Link
主席树

思路

用 size 数组表示当前子树节点个数,新加入节点时,若 s i z e ( l c ) = = m i d − l + 1 size(lc) == mid - l + 1 size(lc)==mid−l+1,则递归右子树,否则递归左子树。
相对应的,询问第 i 个位置的字母时,若 i ≤ s i z e ( l c ( p ) ) i \leq size(lc(p)) i≤size(lc(p)),则递归左子树,否则递归右子树,并将 i 减去左子树的大小。
注意撤销操作时,最好直接新建根节点,一开始想当然直接将rt减去撤销的步数,然而如果不清空那几块的话显然会有问题,所以还是直接新建更好,时间空间复杂度都低。

代码

// Decline is inevitable,
// Romance will last forever.
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int maxm = 1e3 + 10;
struct SegmentTree {int lc, rc;int size;char sum;
#define lc(p) tree[p].lc
#define rc(p) tree[p].rc
#define sum(p) tree[p].sum
#define size(p) tree[p].size
} tree[maxn << 5];
int rt[maxn], tot;
int n, m;int insert(int pre, int l, int r, char a) {int p = ++tot;lc(p) = lc(pre); rc(p) = rc(pre); size(p) = size(pre);sum(p) = sum(pre);if(l > r) return p;if(l == r) {size(p) = 1;sum(p) = a;return p;}int mid = (l + r) >> 1;if(size(lc(p)) == mid - l + 1)rc(p) = insert(rc(pre), mid + 1, r, a);elselc(p) = insert(lc(pre), l, mid, a);size(p) = size(lc(p)) + size(rc(p));return p;
}
char query(int p, int l, int r, int loc) {if(l >= r) {return sum(p);}int mid = (l + r) >> 1;if(loc <= size(lc(p)))return query(lc(p), l, mid, loc);elsereturn query(rc(p), mid + 1, r, loc - size(lc(p)));
}
void solve() {cin >> n;tot = 0;int now = 0;for(int i = 1; i <= n; i++) {char c;cin >> c;if(c == 'T') {now++;char a;cin >> a;
//            int size = size(rt[now-1]);rt[now] = insert(rt[now-1], 1, n, a);}else if(c == 'U') {int a;cin >> a;
//            now -= a;
//            now = max(0, now);++now;rt[now] = rt[now - a - 1];}else {int loc;cin >> loc;char q = query(rt[now], 1, n, loc);cout << q << endl;}}
}
signed main() {//     ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//    int T; scanf("%d", &T); while(T--)
//    freopen("1channel00.txt","r",stdin);
//    freopen("2.txt","w",stdout);
//    int T; cin >> T; while(T--)solve();return 0;
}

P1383 高级打字机 *相关推荐

  1. 【Luogu】P1383高级打字机

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

  2. P1383 高级打字机

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

  3. 【搜索树】高级打字机(luogu 1383)

    高级打字机 luogu 1383 题目大意: 有三种操作:添加一个字符(更改操作),撤回前iii步步更改操作(更改操作,可以撤回自己),输出某一位的字符,现在要按要求输出字符 原题: 题目描述 早苗入 ...

  4. 高级打字机 (Tries)

    Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...

  5. 【JZOJ3794】【洛谷P1383】高级打字机【主席树】

    题目大意: 题目链接: 洛谷:https://www.luogu.org/problemnew/show/P1383 JZOJ:https://jzoj.net/senior/#main/show/3 ...

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

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

  7. 高级打字机【主席树】【滚动数组】【块状链表】

    题目大意: 一个计算机支持一下三中操作: TT xx:在文章末尾打下一个小写字母xx. UU xx:撤销最后的xx次修改操作. QQ xx:询问当前文章中第xx个字母并输出. InputInput 7 ...

  8. Conclusion

    /* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...

  9. 8.19noip模拟题

      2017 8.19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas ...

最新文章

  1. bat 取得服务列表_基于IDEA热部署更新服务器Tomcat类,服务器Tomcat热更新
  2. Linux下快捷键使用
  3. 【树莓派】小空间树莓派镜像系统备份方法img镜像文件压缩方法
  4. 【Python】Matplotlib绘图中文乱码问题的解决方案
  5. 下拉式菜单在GridView编辑时联动选择
  6. c mysql日期时间格式_[单选] 妊娠期血液成分发生改变,下述哪项是正确的()...
  7. OpenCL将数组从内存copy到显存
  8. 隐藏窗体关闭按钮_VB编程(五)按钮和窗体
  9. pyautogui的两天坑moveto图像识别
  10. 第一章 Verilog语言和Vivado初步使用
  11. 怎样提高数据库查询效率
  12. 对异常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解
  13. RocketMQ(十)RocketMQ事务消息
  14. EMS、CEM、OEM、ODM、IDH、IDM介绍
  15. 克鲁斯卡尔(Kruskal)算法(严蔚敏C语言)
  16. VMware下安装虚拟机windows server 2016
  17. 史上最全场景文字识别资源汇集(56篇重要论文 + 20 个开源代码 + 330 个实验结果 + 1882个统计信息)...
  18. xutils获取数据
  19. 基于Android的短信应用开发(六)——将发出短信存至数据库
  20. c语言 int类型转换为string类型

热门文章

  1. 【让我们一路修行,一路祈福】
  2. 跑python用ThinkPad好还是MacBook好?
  3. html背景音乐淡入,音乐淡入淡出软件 音乐淡入淡出什么意思 给视频的背景音乐做淡入淡出效果...
  4. 将Excel表格复制到Word中
  5. 牛客小白月赛10 D-饥饿
  6. 闲鱼副业卖什么比较好?闲鱼无货源卖什么产品好?
  7. Java:1009: 求平均分
  8. 计算机专业如何开展课程思政,浙江大学城市学院计算机与计算科学学院 教学办 大讨论|计算学院计算机和软工系开展课程思政大讨论...
  9. proteus画完图怎么保存_proteus怎么把电路图完整的导出来,导到WORD中。
  10. javaweb(八)文件上传