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史上最全详解相关推荐

  1. SpringBoot+SpringSecurity+JWT整合实现单点登录SSO史上最全详解

    作者:波波烤鸭 blog.csdn.net/qq_38526573/article/details/103409430 一.什么是单点登陆 单点登录(Single Sign On),简称为 SSO,是 ...

  2. 大白话告你什么是分布式,史上最全详解!​

    点击上方蓝色"终端研发部",选择"设为星标" 学最好的别人,做最好的我们 大家好,我是为你们操碎了心的小于哥,最后在后台有人经常问我分布式相关的问题.那么到底什 ...

  3. [oracle][史上最全] 详解别名 tnsnames.ora文件

    作用 oracle客户端所需要的一个文件,通过该文件可以配置数据库的连接地址,配置后,不用再输入完整的oracle地址,直接用简易的字符串代替即可. 如本地数据库地址为:127.0.1.1:1521/ ...

  4. SpringCloud Alibaba史上最强详解与史上最系统框架搭建

    框架实现代码资源地址:springCloud_dataservice_bus.zip_springcloudalibaba搭建-Java文档类资源-CSDN下载 目录 一.官网集合: Springbo ...

  5. 史上最全图详解Jvm—诊断工具和JVM监控

    3.1. 工具概述 使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限: 1.无法获取方法级别的分析数据,如方法间的调用关系.各方法的调用次数和调用时间等(这对 ...

  6. BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...

  7. SP10628 COT - Count on a tree (树剖+可持久化线段树)

    题意: 给定一个包含 N 个结点的树. 树节点从 1 到 N编号..每个节点有一个整数权值. 我们会要求您执行以下操作: u v k : 询问从节点 u 到 节点 v 的路径上的第k小的权值 输入 在 ...

  8. 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解

    P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...

  9. 可持久化线段树——主席树

    前言: 最近心(po)血(yu)来(ya)潮(li)学习了一下主席树.(再不学就落伍了) 主席树,即可持久化线段树,支持维护和查询区间的第\(k\)大(小).区间不同种类个数等,基于线段树的思想之上 ...

最新文章

  1. Flask == scoped_session
  2. 【读书笔记】泛型接口 和 泛型方法
  3. 今日代码(200924)--缺失值处理
  4. mysql字段使用timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间,类似mssql的getdate()功能;字段自增...
  5. 用命令创建表空间、用户,并为用户授权、收回权限。
  6. 进阶学习js中的执行上下文
  7. 145_Power BI Report Server自定义Form登录
  8. php.exe占用资源过大,记录一次php占用系统资源过高的问题
  9. 腾讯广告算法大赛 | 复赛第一周周冠军心得分享
  10. Linux使用socket选项的定时器
  11. linux 安卓svn,linux安装svn
  12. 离线搭建安卓环境 adt
  13. 常用国家标准、行业标准、地方标准免费查阅网址,太实用了!
  14. JAVA编程语言基础第六章
  15. 根据IMSI区别运营商
  16. 使用赫夫曼编码进行解码
  17. 计算机器点游戏,24游戏计算器
  18. java8的option避免NullPoint异常
  19. How To Insult Your Enemies
  20. Django 框架学习经验分享

热门文章

  1. HBASE 2.2.6 永久REGION IN TRANSITION 异常解决
  2. Linux报错:Syntax error: “(“ unexpected解决办法
  3. 为什么docker比VM快?
  4. kibana操作elasticsearch:修改数据
  5. Redis 哨兵Sentinel 文档
  6. linux执行python不打印_在Python中执行shell程序而不打印到屏幕
  7. jenkins中Git Parameter Plugin使用
  8. Coding: 整数反转
  9. Mac下PyCharm CE 配置PyQt5环境
  10. Policy-based RL小结(Policy Gradient ; Natural policy gradient ;TRPO;ACKTR;PPO )