Bzoj 3333 高级打字机(主席树)

2023-12-25 15:58

本文主要是介绍Bzoj 3333 高级打字机(主席树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3333 高级打字机
时间限制: 1 s
空间限制: 256000 KB
题目等级 : 大师 Master
题目描述 Description
早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。
请为这种高级打字机设计一个程序,支持如下3种操作:
1.T x:在文章末尾打下一个小写字母x。(type操作)
2.U x:撤销最后的x次修改操作。(Undo操作)
(注意Query操作并不算修改操作)
3.Q x:询问当前文章中第x个字母并输出。(Query操作)
文章一开始可以视为空串。
输入描述 Input Description
第1行:一个整数n,表示操作数量。
以下n行,每行一个命令。保证输入的命令合法。
输出描述 Output Description
每行输出一个字母,表示Query操作的答案。
样例输入 Sample Input
7
T a
T b
T c
Q 2
U 2
T c
Q 2
样例输出 Sample Output
b
c
数据范围及提示 Data Size & Hint
对于40%的数据 n<=200;
对于50%的数据 n<=100000;保证Undo操作不会撤销Undo操作。
<高级挑战>
对于100%的数据 n<=100000;Undo操作可以撤销Undo操作。

/*
主席树.
一开始傻逼了.
想要维护这个时间点的一个状态.
然后发现这样维护状态是不合法的.
比如说删除操作后无法和上一个时间点建立联系.
更别说维护链了.
大概没有人和我这么傻逼吧orz.
题目编号亮了hhh.
*/
#include<iostream>
#include<cstdio>
#define MAXN 100001
using namespace std;
int n,n1,root[MAXN],t,tot,size[MAXN];
struct data{int lc,rc,x;}tree[MAXN*20];
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*f;
}
void add(int &k,int last,int l,int r,int x,int y)
{k=++tot;tree[k].lc=tree[last].lc,tree[k].rc=tree[last].rc;if(l==r) {tree[k].x=y;return ;}int mid=(l+r)>>1;if(x<=mid) add(tree[k].lc,tree[last].lc,l,mid,x,y);else add(tree[k].rc,tree[last].rc,mid+1,r,x,y);return ;
}
void query(int k,int l,int r,int x)
{if(l==r) {printf("%c\n",tree[k].x+96);return ;}int mid=(l+r)>>1;if(x<=mid) return query(tree[k].lc,l,mid,x);else return query(tree[k].rc,mid+1,r,x);
}
int main()
{int x;char y;n=read();char ch[3];for(int i=1;i<=n;i++){scanf("%s",ch);if(ch[0]=='T') {cin>>y;t++;size[t]=size[t-1]+1;add(root[t],root[t-1],1,n,size[t],int(y-96));}else if(ch[0]=='U'){x=read();root[t+1]=root[t-x];size[t+1]=size[t-x];t++;}else {x=read();//root[i]=root[i-1];//size[i]=size[i-1];query(root[t],1,n,x);n1++;}}return 0;
}

这篇关于Bzoj 3333 高级打字机(主席树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536071

相关文章

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Mysql高级篇(中)——索引介绍

Mysql高级篇(中)——索引介绍 一、索引本质二、索引优缺点三、索引分类(1)按数据结构分类(2)按功能分类(3) 按存储引擎分类(4) 按存储方式分类(5) 按使用方式分类 四、 索引基本语法(1)创建索引(2)查看索引(3)删除索引(4)ALTER 关键字创建/删除索引 五、适合创建索引的情况思考题 六、不适合创建索引的情况 一、索引本质 索引本质 是 一种数据结构,它用

linux高级学习10

24.9.7学习目录 一.线程1.线程API 一.线程 线程与进程的关系: 线程是轻量级进程,也有PCB,只是各自不同,创建线程使用的底层函数和进程一样,都是clone进程可以蜕变成线程线程是最小的执行单位,进程是最小的分配资源单位 1.线程API (1)查看线程号 #include <pthread.h>pthread_t pthread_self(); (2)

Mysql高级教程

1.安装部署 安装依赖性: [root@mysql-node10 ~]# dnf install cmake gcc-c++ openssl-develncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el7_4.x86_64.rpm rpcgen.x86_64 下载并解压源码包 [root@mysql-node10 ~]# tar zx

Java高级Day38-网络编程作业

112.网络编程作业 //1.使用字符流的方式,编写一个客户端程序和服务器端程序//2.客户端发送"name",服务器端接收到后,返回"我是nova"//3.客户端发送"hobby",服务器端接收到后,返回"编写java程序"//4.不是这两个问题,回复"你说啥呢"​​===============//客户端//===============public class SocketT

掌握Hive函数[2]:从基础到高级应用

目录 高级聚合函数 多进一出 1. 普通聚合 count/sum... 2. collect_list 收集并形成list集合,结果不去重 3. collect_set 收集并形成set集合,结果去重  案例演示 1. 每个月的入职人数以及姓名  炸裂函数  概述  案例演示 1. 数据准备 1)表结构 2)建表语句 3)装载语句 2. 需求 1)需求说明 2)答

linux高级学习9

24.9.6学习目录 一.共享内存1.共享内存的API 一.共享内存 特点: 其在进程间共享数据的方法中是最快的要注意对给定存储区访问时进行互斥 1.共享内存的API (1)获取共享内存标识符 在shell中使用 ipcs -m进行查看共享内存 ipcrm -m shmid删除共享内存 #include <sys/ipc.h>#include <sys/shm.h>

notepad下载安装使用以及高级使用技巧

前言 Notepad++是一款广受欢迎的文本编辑器,尤其受到开发者和编程人员的喜爱。它支持多种编程语言的语法高亮显示,并且提供了丰富的插件系统,使得功能可以轻松扩展。本文将详细介绍如何在Windows操作系统上下载、安装Notepad++,以及基本的使用技巧。 Notepad++简介 Notepad++是一个免费的开源文本编辑器,它不仅支持纯文本编辑,还支持众多编程语言的语法高亮显示。它比W