题目大意

给出一个空字符串支持在末尾加上一个字符,查询某个位置的字符,回到 k k k 个操作前.

分析

显然的可持久化数组,可以通过可持久化线段树实现,为了方便处理,开始的区间是 1 1 1 到 1000000 1000000 1000000 开始,这样保证不会出问题,加上一个数就直接单点修改,查询也只要直接单点查询,对于每次修改对于修改的区间部分产生一个新的版本,其他仍然用之前版本的部分.

代码

#include<bits/stdc++.h>
#define RAP(i,first,last) for(int i=first;i<=last;++i)
#define LSON tree[now].lson
#define RSON tree[now].rson
#define MIDDLE ((left+right)>>1)
#define LEFT LSON,left,MIDDLE
#define RIGHT RSON,MIDDLE+1,right
#define NOW now_left,now_right
#define NEW_LSON tree[new_tree].lson
#define NEW_RSON tree[new_tree].rson
using namespace std;
const int maxM=2e6+7;
int N=1e6/*从1e6开始查询*/,M;
struct Tree
{int sum,lson,rson;
}tree[maxM*32];
int cnt=0;
void UpData(int &new_tree,int num,int ch,int now,int left=1,int right=N)//标准可持久化线段树
{if(num<left||right<num)//如果不会被修改就直接用原来的内容{new_tree=now;return;}new_tree=++cnt;//否则产生一个新的点if(left==right)//到叶节点就直接单点修改{tree[new_tree].sum=ch;return;}UpData(NEW_LSON,num,ch,LEFT);UpData(NEW_RSON,num,ch,RIGHT);
}
int Query(int k,int now,int left=1,int right=N)//单点查询
{if(k<left||right<k)return 0;if(left==right)//叶节点直接返回{return tree[now].sum;}return Query(k,LEFT)+Query(k,RIGHT);
}
int root[maxM];//记录每次修改的线段树的根节点编号
int len[maxM];//记录每个版本的数组长度
int main()
{cin>>M;char ch;int x;char add;int tot=0;//记录当前修改操作个数RAP(i,1,M){cin>>ch;if(ch=='T')//修改部分{++tot;cin>>add;len[tot]=len[tot-1]+1;UpData(root[tot],len[tot],add,root[tot-1]);}if(ch=='U')//回到x个版本前,就直接改变线段树的根节点就好了{++tot;cin>>x;root[tot]=root[tot-x-1];len[tot]=len[tot-x-1];}if(ch=='P')//单点查询{cin>>x;printf("%c\n",Query(x+1,root[tot]));}}return 0;
}

P6166 [IOI2012]scrivener相关推荐

  1. c++自带的可持久化平衡树?rope大法好!(超详细解答 + 5道例题讲解,可直接替代可持久化的线段树、并查集、平衡树!)

    整理的算法模板合集: ACM模板 目录 c++自带的可持久化平衡树?rope大法好! 1. 声明 2. 支持操作 char类型的rope int类型的rope 3. 具体的细节 4. "可持 ...

  2. 【Rope大法好】【STL中丧心病狂的可持久化平衡树】

    曾经我不会写平衡树--于是在STL中乱翻--学到了pb_ds库中的SXBK的斐波那契堆.支持kth的set,和--ext/rope 先发一个官方的 说明 (鸣谢maoxiaohan1999): htt ...

  3. (个人翻译)Scrivener交互式手册中文版FowWindows 03基础操作

    文章目录 新手指引 主界面 活页夹 使用活页夹 特殊文件夹 其他文件夹没有特别之处 搜索 编辑器 使用编辑器 头视图 脚视图 检视器 概要与笔记 概要索引卡 笔记 标签与状态 书签 项目书签 元数据 ...

  4. (个人翻译)Scrivener交互式手册中文版FowWindows 01从这里开始

    从这里开始 译者的话 本文档由个人翻译,感谢Google翻译.微软翻译.iTranslate的技术支持.此版本的翻译基于Scrivener for Windows 3.1.1.另,部分与原文出入或补充 ...

  5. 备注一下从MarginNote到Scrivener的过程

    1.用MarginNote将英文文献进行翻译,保留一级标题,尽量让大钢结构在三层之内 2.将MarginNote文档通过word导出,1)在word中将">>"符号全部 ...

  6. 正版Scrivener 3 论文/小说写作工具神器软件

    一款非常优秀的写作软件,提供了各种写作辅助功能,如标注多个文档.概述介绍.全屏幕编辑.快照等,能够轻松.便捷的辅助作者从作品构思.搜集资料.组织结构.增删修改到排版输出的整个写作流程. 作为一个专业的 ...

  7. (个人翻译)Scrivener交互式手册中文版FowWindows 02核心理念

    核心概念 什么是Scrivener? Scrivener 关注于需要构思长篇文本的作家--小说家.记者.学者.编剧.剧作家.这是为制作手稿量身定做的一个活页本.剪贴簿.桌面工具集.大纲编辑器和文本编辑 ...

  8. Mac下如何在Scrivener 中插入MathType公式

    MathType是一个"所见即所得"的数学公式编辑器,同时支持Windows和Macintosh 操作系统,能够在各种文档中加入复杂的数学公式和符号,在使用Scrivener写技术 ...

  9. Mac OS X 创新卡关三年,唯一看得出版本不同之处是「预设桌布」

    当苹果将重点转移到 iOS,其桌面操作系统已陷入一片混乱.主要开发 Mac 的四位开发人员说:「是时候该转变了!」 如果传言是真的,今年 6 月 2 日苹果全球软件开发者年会 (WWDC),将是 WW ...

最新文章

  1. C++_STL——stack
  2. 南洋理工75页最新「深度学习对话系统」大综述论文,最全面概述深度学习对话技术进展...
  3. Android-Binder进程间通讯机制-多图详解
  4. 企业级 SpringBoot 教程 (十二)springboot集成apidoc
  5. 你以为ACI=SDN?大错特错!
  6. 全球及中国木材加工行业运行状况与投资产值预测报告2022版
  7. 数据库毗连过多的错误,年夜概的启事分解及措置惩罚行动
  8. TCP协议——三次握手与四次关闭
  9. 在Spring Boot中使用Vaadin的简介
  10. 面向数据科学的概率论 一、基础
  11. GDAL读取S-57海图数据中文属性值乱码问题解决(续)
  12. android垂直排列元素_元素的视图属性之client
  13. 【数据结构】二分查找代码模板
  14. 传感器网络与物联网-1.射频识别技术
  15. 地铁译:Spark for python developers --- 搭建Spark虚拟环境 4...
  16. 计算机快捷键大全截图,电脑截图按什么键?电脑截图的快捷键是什么
  17. 笔记本电脑怎样重装系统
  18. 使用STM32的DFSDM外设来驱动PDM麦克风进行音频采集
  19. GPGPU渲染GPU的工作原理和认知总结
  20. 翻译,怎样将图片文字翻译成英文

热门文章

  1. 超级巡警4.0 Beta6 发布,新增Arp防火墙!
  2. 微信H5页面生成图片并长按下载
  3. 跑跑卡丁车 android ios,跑跑卡丁车官方竞速版ios版
  4. 什么?跑跑卡丁车明天要出手游了?电脑玩跑跑卡丁车手游攻略提前看
  5. 微擎按照UID获取用户绑定手机号
  6. 2019.8.2 JZ DAY2总结
  7. 在 The Sandbox Alpha 第三季中体验金塔谷社交中心,探索多生物群系
  8. 小学生计算机模型的制作,19届中小学电脑制作活动精选课件:创意环保设计
  9. PostgreSQL命令行执行查询
  10. BIO,NIO,AIO分别是什么?他们有什么区别?