主席树用于维护多个版本的线段树。由于开多颗线段树的话空间会炸到飞起,所以可以充分利用每棵线段树中的重复部分。比如在第$i + 1$的版本的末尾新增一个节点,第$i + 1$棵版本的线段树和第i棵线段树的区别只是rt的右儿子及其子树中的一小部分。我们就可以在每一次更新版本时,另开那些有变化的节点,并与没有变化的节点连边(我们把这称之为动态开点),再把新版本的根节点存起来,这样即可节省大量空间。查询仿照普通线段树即可,
注意事项
有些题目一开始一定要开一棵空树;
JZOJ 3794 高级打字机
Description
早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。
请为这种高级打字机设计一个程序,支持如下3种操作:
T x:在文章末尾打下一个小写字母x。(type操作)
U x:撤销最后的x次修改操作。(Undo操作)(注意Query操作并不算修改操作)
Q x:询问当前文章中第x个字母并输出。(Query操作)文章一开始可以视为空串。
Input
第1行:一个整数n,表示操作数量。以下n行,每行一个命令。保证输入的命令合法。
Output
每行输出一个字母,表示Query操作的答案。
Sample Input
1 | 7 |
Sample Output
1 | bc |
Data Constraint
n<=100000;Undo操作可以撤销Undo操作。
代码
1 |
|