【可持久化线段树?!】rope史上最全详解
https://www.luogu.org/problemnew/show/P3919
看到上面链接中的题时,我在学会可持久化线段树的同时,第一次学会了一个非常屌(cai)的STL大法——rope!!!
这是一个非标准的STL工具,一般情况下要支持c++11或更高才能用(上次去参加APIO时人家毛子评测用的是c++14啊喂!)
正题:
它的头文件是什么:#include<ext/rope> (注:你可以打开devcpp的目录去翻一翻rope这个头文件看看它的操作啊!)
除了头文件以外还需要什么:using namespace __gnu_cxx; (注:正是因为需要使用这种非std的标准命名空间,大部分竞赛才无法支持这个工具)
定义方法:rope<变量类型>变量名称;
或 crope 变量名称;
其中crope相当于定义成rope<char>,即定义为string类型
它到底是什么:
那得看你想听哪种解释了。
人话解释:超级string
算法解释:块状链表(即讲链表与数组的优势结合,形成分块思想)
用途解释:这本来是一个用于快速操作string的工具,却一般被定义成int,然后用作可持久化线段树!
它有哪些操作(重点):
●如果你把rope定义为string:
insert(int pos, string &s, int n) 将字符串s的前n位插入rope的下标pos处,如没有参数n则将字符串s的所有位都插入rope的下标pos处 (补充地址知识:如果你不想从字符串下标为0(即第一个字符)的地址开始取n位,就将你想开始取的地址代入。如s+1表示从字符串下标为1(即第二个字符)的地址开始取n位。int、char等变量类型的数组都适用这种方法来更改数组操作的起始位置。)
示例代码:
1 char a[10]; 2 for(int i=0;i<10;i++) a[i]=i+'0'; 3 r.insert(0,a+1,8); 4 for(int i=0;i<10;i++) cout<<r.at(i);
append(string &s,int pos,int n) 把字符串s中从下标pos开始的n个字符连接到rope的结尾,如没有参数n则把字符串s中下标pos后的所有字符连接到rope的结尾,如没有参数pos则把整个字符串s连接到rope的结尾(这里已经给你起始位置参数pos了就没必要用上述的取地址方法了哈)
(insert和append的区别:insert能把字符串插入到rope中间,但append只能把字符串接到结尾)
substr(int pos, int len) 提取rope的从下标pos开始的len个字符
at(int x) 访问rope的下标为x的元素
erase(int pos, int num) 从rope的下标pos开始删除num个字符
copy(int pos, int len, string &s) 从rope的下标pos开始的len个字符用字符串s代替,如果pos后的位数不够就补足
replace(int pos, string &x);//从rope的下标pos开始替换成字符串x,x的长度为从pos开始替换的位数,如果pos后的位数不够就补足
以上是常用操作,不常用操作这里就不再赘述。
●如果你把rope定义为int(这里只是以int为例):
insert(int pos, int *s, int n) 将int数组(以下的s都是int数组)s的前n位插入rope的下标pos处,如没有参数n则将数组s的所有位都插入rope的下标pos处
append(int *s,int pos,int n) 把数组s中从下标pos开始的n个数连接到rope的结尾,如没有参数n则把数组s中下标pos后的所有数连接到rope的结尾,如没有参数pos则把整个数组s连接到rope的结尾
substr(int pos, int len) 提取rope的从下标pos开始的len个数
at(int x) 访问rope的下标为x的元素
erase(int pos, int num) 从rope的下标pos开始删除num个数
copy(int pos, int len, int *s) 从rope的下标pos开始的len个数用数组s代替,如果pos后的位数不够就补足
replace(int pos, int *x);//从rope的下标pos开始替换成数组x,x的长度为从pos开始替换的位数,如果pos后的位数不够就补足
示例代码:
r.append(3); r.append(1); r.append(2); r.append(1); r=r.substr(1,3); for(int i=0;i<r.size();i++) printf("%d ",r.at(i));
它有哪些好处:
时间复杂度:O(n*sqrt(n)),具体原理详见块状链表
空间复杂度:O(玄学),此处非常神奇,假如用rope存n个整数,它几乎只需要sqrt(n)的块空间加上一些链表指针的微小空间(个人猜测)。比如下面切的这道题就大方地开了100w个rope,每个rope都是一个存了100w个数的版本……我真是震惊了这东西真的这么省空间?
示范切题:以最上面那个链接中的题为例(可持久化线段树模板)
未完待续
转载于:https://www.cnblogs.com/scx2015noip-as-php/p/rope.html
【可持久化线段树?!】rope史上最全详解相关推荐
- SpringBoot+SpringSecurity+JWT整合实现单点登录SSO史上最全详解
作者:波波烤鸭 blog.csdn.net/qq_38526573/article/details/103409430 一.什么是单点登陆 单点登录(Single Sign On),简称为 SSO,是 ...
- 大白话告你什么是分布式,史上最全详解!
点击上方蓝色"终端研发部",选择"设为星标" 学最好的别人,做最好的我们 大家好,我是为你们操碎了心的小于哥,最后在后台有人经常问我分布式相关的问题.那么到底什 ...
- [oracle][史上最全] 详解别名 tnsnames.ora文件
作用 oracle客户端所需要的一个文件,通过该文件可以配置数据库的连接地址,配置后,不用再输入完整的oracle地址,直接用简易的字符串代替即可. 如本地数据库地址为:127.0.1.1:1521/ ...
- SpringCloud Alibaba史上最强详解与史上最系统框架搭建
框架实现代码资源地址:springCloud_dataservice_bus.zip_springcloudalibaba搭建-Java文档类资源-CSDN下载 目录 一.官网集合: Springbo ...
- 史上最全图详解Jvm—诊断工具和JVM监控
3.1. 工具概述 使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限: 1.无法获取方法级别的分析数据,如方法间的调用关系.各方法的调用次数和调用时间等(这对 ...
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- SP10628 COT - Count on a tree (树剖+可持久化线段树)
题意: 给定一个包含 N 个结点的树. 树节点从 1 到 N编号..每个节点有一个整数权值. 我们会要求您执行以下操作: u v k : 询问从节点 u 到 节点 v 的路径上的第k小的权值 输入 在 ...
- 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解
P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...
- 可持久化线段树——主席树
前言: 最近心(po)血(yu)来(ya)潮(li)学习了一下主席树.(再不学就落伍了) 主席树,即可持久化线段树,支持维护和查询区间的第\(k\)大(小).区间不同种类个数等,基于线段树的思想之上 ...
最新文章
- Flask == scoped_session
- 【读书笔记】泛型接口 和 泛型方法
- 今日代码(200924)--缺失值处理
- mysql字段使用timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间,类似mssql的getdate()功能;字段自增...
- 用命令创建表空间、用户,并为用户授权、收回权限。
- 进阶学习js中的执行上下文
- 145_Power BI Report Server自定义Form登录
- php.exe占用资源过大,记录一次php占用系统资源过高的问题
- 腾讯广告算法大赛 | 复赛第一周周冠军心得分享
- Linux使用socket选项的定时器
- linux 安卓svn,linux安装svn
- 离线搭建安卓环境 adt
- 常用国家标准、行业标准、地方标准免费查阅网址,太实用了!
- JAVA编程语言基础第六章
- 根据IMSI区别运营商
- 使用赫夫曼编码进行解码
- 计算机器点游戏,24游戏计算器
- java8的option避免NullPoint异常
- How To Insult Your Enemies
- Django 框架学习经验分享
热门文章
- HBASE 2.2.6 永久REGION IN TRANSITION 异常解决
- Linux报错:Syntax error: “(“ unexpected解决办法
- 为什么docker比VM快?
- kibana操作elasticsearch:修改数据
- Redis 哨兵Sentinel 文档
- linux执行python不打印_在Python中执行shell程序而不打印到屏幕
- jenkins中Git Parameter Plugin使用
- Coding: 整数反转
- Mac下PyCharm CE 配置PyQt5环境
- Policy-based RL小结(Policy Gradient ; Natural policy gradient ;TRPO;ACKTR;PPO )