PowerOJ2546: fork【C++ STL __gnu_cxx::rope】

2023-11-12

题目链接


我们可以这样定义一个可持久化数组

rope<int> rp;

push_back(x):在末尾添加x (x是int)

erase(pos, x): 从pos开始删除x个

at(x)/[x]:访问第x个元素

用以上这些操作可以解决这道题了,但是rope还有其他的操作:


如果将rope用来维护char类型,那么:

rope<char> rp;

push_back(x):在末尾添加x (x是char)

insert(pos,x):在pos插入x (x是字符串,x后面加个int参数可以只能x中插入几个)

erase(pos,x): 从pos开始删除x个

replace(pos,x): 从pos开始换成x(x是字符串,x后面加个int参数可以只能x中的前几个)

substr(pos,x):提取pos开始x个

copy(x):复制rope中所有内容到x字符串

at(x)/[x]:访问第x个元素

例如:

a[1] = new rope<char>('0');
a[2] = new rope<char>(*a[1]);
a[2]->push_back('1');
a[3] = new rope<char>;
*a[3] = a[2]->substr(0, 2);
a[3]->replace(0, 3, "345");

 


  如何解决这道问题呢?

  很容易解决删除尾和新增尾的操作,但是如何可持久化呢?也就是O(1)的继承历史状态?

a[++N] = new rope<int>(*a[x]);

  新增一个点,然后继承第x个点的状态。

  需要记录它的历史状态。

  但是遗忘应该如何处理呢?可以是用一个head[x]来维护x点的目前的状态(因为可以将rope看成一个数组)。然后删除的话,可以直接从head[x] + 1删除到尾部。

#include <cstdio>
#include <cstring>
#include <ext/rope>
using namespace std;
using namespace __gnu_cxx;
const int maxn = 5e5 + 7;
int Q, M, N = 1;
rope<int> *a[maxn];
int head[maxn] = {0};
int main()
{
    a[1] = new rope<int>(0);
    scanf("%d%d", &Q, &M);
    char s[10];
    for(int i=1, x, y; i<=Q; i++)
    {
        scanf("%s", s); scanf("%d", &x);
        if(s[0] == 'l') //learn
        {
            scanf("%d", &y);
            head[x]++;
            a[x]->erase(head[x], a[x]->length() - head[x]);
            a[x]->push_back(y);
        }
        else if(s[0] == 'r' && s[1] == 'o') //rollback
        {
            head[x]--;
        }
        else if(s[0] == 'r' && s[1] == 'e') //relearn
        {
            head[x]++;
        }
        else if(s[0] == 'c')    //check
        {
            printf("%d\n", a[x]->at(head[x]));
        }
        else    //fork
        {
            a[++N] = new rope<int>(*a[x]);
            head[N] = head[x];
        }
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerOJ2546: fork【C++ STL __gnu_cxx::rope】 的相关文章

随机推荐

  • 理解Android上下文Context

    Context使用场景总的来说分为两大类 使用Context调用方法 比如启动Activity 访问资源 调用系统级服务等 调用方法时传入Context 比如弹出Toast 创建Dialog等 Activity Service和Applic
  • 安装snownlp报错 error: subprocess-exited-with-error

    安装snownlp报错error subprocess exited with error 解决方案重新安装importlib metadata pip uninstall importlib metadata pip install im
  • Zabbix监控平台部署实验——自定义zabbix监控项目

    Zabbix系列文章目录 第一章 Zabbix5 0版本的安装教程 第二章 Zabbix监控平台部署实验 自定义zabbix监控项目 目录 Zabbix系列文章目录 前言 二 操作步骤 1 安装配置环境 2 授权zabbix server可
  • STM32HAL库的基本使用(1)- GPIO引脚配置

    前言 作者使用的是STM32L431RCT的开发板 Cortex M4的内核 是大学老师教学用的 原理图如下 原理图下载链接 https pan baidu com s 1c8WFBO9bPxarzaOKqDrl0Q pwd 6666 提取
  • Android中Recycler网格布局管理器GridLayoutManager用法

    使用RecyclerView可以制作出类似GridView的样式 但比GridView更加强大 这里我们就介绍一下RecyclerView和GridLayoutManager结和的用法 1 GridLayoutManager常用方法 构造函
  • ROS:开机自启动

    Ubuntu14 04 网上很多资料说在 etc rc local中添加脚本 实验之后完全没用 可能是系统版本不对 解决 Ubuntu14 04 开机项命令 gnome session properties 点击 add name 名字 c
  • mysql count(*)、count(1) 、count(列名)、count(distinct expr)

    文章目录 概述 优化 MyISAM InnoDB 参考文档 https dev mysql com doc refman 8 0 en group by functions html function count 概述 count 为 SQ
  • 蓝桥杯每日一题2023.9.8

    蓝桥杯2023年第十四届省赛真题 飞机降落 C语言网 dotcpp com 题目描述 N 架飞机准备降落到某个只有一条跑道的机场 其中第 i 架飞机在 Ti 时刻到达机场上空 到达时它的剩余油料还可以继续盘旋 Di 个单位时间 即它最早 可
  • Learning Video Object Segmentation from Static Images

    Abstract 论文灵感来源于 实例分割和目标跟踪 特点 1 我们的模型在每帧的基础上进行 并由前一帧的输出导向下一帧中的关注对象 2 一个高度准确的视频目标分割可以用一个卷积神经网络并用静态的图片来训练 3 使用在线和离线的策略 前者产
  • 为什么那么多的人选择到Java培训机构学习

    目前IT行业Java编程是最炙手可热的技术 Java应用范围广泛 企业在大量招收Java人才 薪水也随之上涨 发展前景越来越好 因此现在有越来越多的人发现了这片美丽的新大陆 都正在拼命往里的挤 一些觉得Java培训机构费用贵的同学会选择自学
  • public Map kaoYanAllStation() { Map map = new HashMap<>(); ...

    首先 根据代码中的注释可以看出 该方法主要是获取各种气象数据 对其进行计算和比较 然后将结果存储在一个 Map 对象中返回 为了优化这段代码 可以考虑以下几个方面 减少重复代码 在代码中可以看到 获取历年同期降水和温度数据的代码几乎一模一样
  • LVS常用模式(DR、NAT、TUN)以及ldirector和keepalived

    1 LVS简单介绍 1 lvs定义LVS是Linux Virtual Server的简写 意即Linux虚拟服务器 是一个虚拟的服务器集群系统 LVS集群采用IP负载均衡技术和基于内容请求分发技术 调度器具有很好的吞吐率 将请求均衡地转移到
  • Java学习教程,Java从入门到精通,全套Java视频教程+笔记+配套工具

    目录 一 大纲 一 Java基础 二 计算机基础 三 工具的使用 四 数据库 五 web前端 六 JavaWeb 七 框架 八 互联网分布式技术 发现身边很多自学java却放弃的 真的挺可惜的 白白浪费了几个月宝贵的时间 且放弃一次 就会有
  • 第二十二章 Spring AOP⾥⾯的代理知识

    1 静态代理和动态代理 什么是代理 为某 个对象创建 个代理对象 程序不直接 原本的对象 是由创建的代理对象来控制对原对象 通过代理类这中间 层 能有效控制对委托类对象的直接访问 也可以很好地隐藏和保护委托类对象 同时也为实施不同控制策略预
  • 05-网络的四层协议和七层协议

    TCP IP网络分层模型 TCP IP的设计创造性的提出了分层的概念 把复杂的网络通信划分出多个层次 再为每一个层次分配不同的职责 层次内只专心做好自己的事情 用分而治之的思想把一个大麻烦拆分成了数个小麻烦 从而解决了网络的难题 TCP I
  • JAVA中的for循环使用方法

    一 循环结构 1 概念 在学习Java里的循环之前 我们先来了解一下到底什么是循环 以及循环的作用 我们先来看下面这张图 大家想一下 我们在400米的跑道上参加万米长跑 正常情况下要跑25圈 这25圈每一圈的跑步过程其实都是一样的 相当于是
  • springboot过滤器和拦截器

    一 过滤器和拦截器的区别 1 过滤器和拦截器触发时机不一样 过滤器是在请求进入容器后 但请求进入servlet之前进行预处理的 请求结束返回也是 是在servlet处理完后 返回给前端之前 2 拦截器可以获取IOC容器中的各个bean 而过
  • Volatility3内存取证工具使用详解

    Volatility 介绍 Volatility是一款开源的内存取证分析工具 是一款开源内存取证框架 能够对导出的内存镜像进行分析 通过获取内核数据结构 使用插件获取内存的详细情况以及系统的运行状态 支持Windows Linux MaC
  • org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder 找不到依赖包

    org springframework boot autoconfigure jdbc DataSourceBuilder 找不到依赖包 org springframework boot autoconfigure jdbc DataSou
  • PowerOJ2546: fork【C++ STL __gnu_cxx::rope】

    题目链接 我们可以这样定义一个可持久化数组 rope