简要题意

你需要维护一个栈,有 \(n\) 个操作,支持:

  • 给定一个 \(x\),将 \(x\) 加入栈。
  • 将一个元素出栈。
  • 给定一个 \(x\),将当前栈回退到 第 \(x\) 操作前

每一次操作结束后,你需要输出栈顶元素。如果当前栈是一个空栈,那么输出 \(-1\)。

数据保证操作合法,且 \(1 \le n \le 8 \times 10^{4}\)。

思路

据说本题存在 \(O(n)\) 做法,但是我不会,这里有一个 \(O(n\log n)\) 做法。

对于 回退 之类的字眼,我们肯定会想到可持久化,由于栈一般时用数组实现的,所以我们可以写一个可持久化数组。如果不会可持久化数组,请去做 模板题

下面有一个用数组实现的栈的简要代码,对于分析很有帮助:

int stk[114514],t;
void push(int v){
stk[++t]=v;
}
void pop(){
t--;
}
int top(){
return (t==0)?(-1):(stk[t]);
}

我们可以考虑用可持久化数组来维护 stk,那么 \(t\) 怎么办?我们发现,\(t\) 需要是一个可持久化变量,可持久化变量不就是数组吗?于是我们直接使用数组 \(T_i\) 来表示第 \(i\) 次操作后栈顶指针 \(t\)。

整个代码时间复杂度和空间复杂度都是 \(O(n\log n)\) 的(可持久化的开销)。

代码

#include <bits/stdc++.h>
#define mid ((l+r)>>1)
using namespace std; const int SIZE = 8e4+5;
struct{
int l,r,v;
}t[SIZE*25];
int top;
int root[SIZE*25];
int n; int newnode(int i){
t[++top]=t[i];
return top;
} int update(int i,int l,int r,int p,int val){
i=newnode(i);
if(l==r){
t[i].v=val;
return i;
}
if(p<=mid){
t[i].l=update(t[i].l,l,mid,p,val);
}
else{
t[i].r=update(t[i].r,mid+1,r,p,val);
}
return i;
} int query(int i,int l,int r,int p){
if(l==r){
return t[i].v;
}
if(p<=mid){
return query(t[i].l,l,mid,p);
}
else{
return query(t[i].r,mid+1,r,p);
}
} int stop[SIZE]; int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
root[i]=root[i-1];
stop[i]=stop[i-1];
char op;
int x;
cin>>op;
if(op=='a'){
cin>>x;
root[i]=update(root[i-1],1,n,(++stop[i]),x);
}
else if(op=='s'){
stop[i]--;
}
else{
cin>>x;
root[i]=root[x-1];
stop[i]=stop[x-1];
}
if(stop[i]!=0){
cout<<query(root[i],1,n,stop[i])<<'\n';
}
else{
cout<<-1<<'\n';
}
}
return 0;
}

跑了 \(113\) 毫秒,比 \(O(n)\) 的慢。

AC Record

可持久化栈学习笔记 | 题解 P6182 [USACO10OPEN]Time Travel S的更多相关文章

  1. 可持久化trie学习笔记

    其实很早之前就想学习可持久化trie,不过由于换队友等情况,还是优先去学数论和计算几何,今天突然心血来潮学了一发可持久化trie,感觉还是蛮简单的,不过由于自己很长时间没写过可持久化了,都快忘了是个什 ...

  2. PHP全栈学习笔记18

    php基础知识,JavaScript,jQuery,ajax基础知识 linux基础知识,mysql数据库的基础与优化 程序设计,PHP框架基础知识,算法,逻辑思维,高并发 PHP基础知识 引用变量, ...

  3. PHP全栈学习笔记13

    php与ajax技术 web2.0的到来,ajax逐渐成为主流,什么是ajax,ajax的开发模式,优点,使用技术.(ajax概述,ajax使用的技术,需要注意的 问题,在PHP应用ajax技术的应用 ...

  4. PHP全栈学习笔记12

    php简介,php历史,php后端工程师职业前景,php技术方向,php后端工程师职业体系介绍. php是世界上使用最广泛的web开发语言,是超文本预处理器,是一种通用的开源脚本语言,语法吸收了c语言 ...

  5. PHP全栈学习笔记17

    phpmyadmin教程 管理页进入phpmyadmin 打开C:\wamp\apps\phpmyadmin3.5.1下的配置文件:config.inc 修改密码 创建与修改数据库.数据表 字段类型 ...

  6. PHP全栈学习笔记16

    <?php $fileName = "php大师.test.php"; //补充程序,显示文件名(不包括扩展名) $start = strrpos($fileName, &q ...

  7. PHP全栈学习笔记15

    PHP标记风格 PHP一共支持4种标记风格 <?php echo "这是XML风格的标记"; ?> 脚本风格 <script language="php ...

  8. PHP全栈学习笔记14

    一.搭建PHP开发环境 Apahce服务器 Dreamwear创建站点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  9. PHP全栈学习笔记11

    连接MySQL mysql_connect(servername,username,password); 面向对象: <?php $servername = "localhost&qu ...

  10. PHP全栈学习笔记10

    php常量,常量是不能被改变的,由英文字母,下划线,和数字组成,但是数字不能作为首字母出现. bool define ( string $name , mixed $value [, bool $ca ...

随机推荐

  1. HTML+CSS基础知识(5)相对定位、绝对定位、固定定位

    文章目录 1.相对定位 1.1 代码 1.2 测试结果 2.绝对定位 2.1 代码 2.2 测试 3.固定定位 3.1 代码 3.2 测试结果 1.相对定位 1.1 代码 <!DOCTYPE h ...

  2. 【.NET 6】RabbitMQ延迟消费指南

    背景 最近遇到一个比较特殊需求,需要修改一个的RabbitMQ消费者,以实现在消费某种特定的类型消息时,延迟1小时再处理,几个需要注意的点: 延迟是以小时为单位 不是所有消息都延迟消费,只延迟特定类型 ...

  3. 你应该知道的数仓安全:都是同名Schema惹的祸

    摘要:我是管理员账号,怎么还没有权限?当小伙伴询问的时候,我第一时间就会想到都是用户同名Schema惹的祸 本文分享自华为云社区<你应该知道的数仓安全--都是同名Schema惹的祸>,作者 ...

  4. IP分类与子网划分

    1.IP地址的格式  每一类地址都由两个固定长度的字段组成: (1)网络号 net-id:它标志主机(或路由器)所连接到的网络 (2)主机号 host-id:它标志该主机(或路由器).   最大可指派 ...

  5. 4.drf-版本管理

    根据RESTful规范,后端API中需要体现出版本,DRF中支持5种版本的设置,常见的三种如下 1. URL的GET中传递参数 在视图类中定义 from rest_framework.versioni ...

  6. Arch Linux 的安装

    Arch Linux 的安装 作者:Grey 原文地址: 博客园:Arch Linux 的安装 CSDN:Arch Linux 的安装 版本 Arch Linux:2022.07.01 VMware ...

  7. 基于python的数学建模---高阶样条插值

    为了满足对函数光滑性的需要,我们可以使用一种有弹性的长条(称之为样条),强迫它弯曲通过样本点. import numpy as npimport matplotlib.pylab as plfrom ...

  8. vue 项目中,后端返回文件流,导出excel

    之前写过文件流导出excel,这次直接把上次的代码拿过来复制粘贴,但是导出的表格里面没有数据,只显示undefined. 这是之前的代码 // api接口页面 // excel导出接口 export ...

  9. i春秋GetFlag

    进去是个提示界面,提示我们这是个迷你文件管理系统,我们需要登录然后下载文件再获得flag. 然后我们查看源码,没什么信息,点login进去查看源码,没什么信息 下方出现了一个substr(md5(ca ...

  10. 解决win7连接蓝牙耳机播放设备找不到的问题

    前言 这个问题其实就是蓝牙驱动问题, 而用第三方软件安装驱动,如驱动精灵安装蓝牙驱动,可能会不出现缺失驱动问题,但是一些功能会受到限制(win7系统与其蓝牙驱动不兼容). 解决办法 去 Inter官网 ...