普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快。

这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面。

对顶栈

众所周知,栈可以维护一系列前缀和,包括前缀最值。但是怎么维护全局的呢?当每次都只会修改栈顶(换句话说是顺序移动,而不是随机移动),那么可以用两个反方向的栈来维护这一段序列。

Codeforces - 1263E - Editor

题意:要求实现一种数据结构,可以查询全局的前缀最大值,全局的前缀最小值,可在任意位置修改,不过修改光标是顺序而不是随机移动的。

这道题原本我是使用线段树来实现的,线段树支持维护随机移动的版本,事实上加入优化之后没有被卡的话真的飞快。但是最好的解法是使用栈来实现的。

把括号序列看作折线,合法的括号序列比如左右括号平衡,这个可以记录一个全局sum直接O(1)维护。栈可以维护前缀和以及前缀和的最大最小值,但是怎么实现全局的呢?非常简单:把光标右侧的压入反方向的栈里面,这样每次修改的只有两边栈的栈顶元素。

把折线从右往左看,全局的前缀最大值当然就是全局的最大值,所以就是两边栈的前缀最大值里面比较大的那个。最小值也是同理。(注意左右移动栈顶的时候符号会反向)

struct Stack {
static const int MAXN = 1000000;
static const int INF = 1061109567;
int s[MAXN + 5];
int mi[MAXN + 5];
int ma[MAXN + 5];
int top, sum; void Clear() {
top = 0;
s[top] = 0;
mi[top] = INF;
ma[top] = -INF;
} void Push(int v) {
++top;
s[top] = v;
sum += s[top];
mi[top] = min(mi[top - 1], sum);
ma[top] = max(ma[top - 1], sum);
} void Pop() {
if(top) {
sum -= s[top];
--top;
}
} int Top() {
return s[top];
} int Min() {
return mi[top];
} int Max() {
return ma[top];
}
} ; struct Editor {
Stack LStack, RStack;
int cur, sum; void LeftShift() {
if(cur == 1)
return;
RStack.Push(-LStack.Top());
LStack.Pop();
--cur;
} void RightShift() {
LStack.Push(-RStack.Top());
RStack.Pop();
++cur;
} void Clear() {
LStack.Clear();
RStack.Clear();
sum = 0;
RightShift();
} void Update(int v) {
int pv = LStack.Top();
if(pv == v)
return;
LStack.Pop();
sum -= pv;
LStack.Push(v);
sum += v;
} int Min() {
return min(LStack.Min(), RStack.Min());
} int Max() {
return max(LStack.Max(), RStack.Max());
} void Show() {
for(int i = 1; i <= LStack.top; ++i)
printf(" %d", LStack.s[i]);
printf(" |");
for(int i = RStack.top; i >= 1; --i)
printf(" %d", RStack.s[i]);
printf("\n");
} } editor;

事实上前缀和不需要额外的空间去维护,保持一个当前前缀和,然后Push和Pop的时候顺便维护一个就可以了。

模板 - 数据结构 - 栈/Stack的更多相关文章

  1. C# 数据结构 栈 Stack

    栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素和元素的逻辑关系也相同 差别在于:线性表的操作不受限制,栈和队列操作受限制(遵循一定的原则),因此栈和队 ...

  2. java数据结构 栈stack

    栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构. 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部. 当你从栈中取元素的时候,就从栈顶 ...

  3. 数据结构—栈(Stack)

    栈的定义--Stack 栈是只允许在末端进行插入和删除的线性表.栈具有后进先出的特性(LIFO ,Last In Fast Out). 学过数据结构的人都知道:栈可以用两种方式来实现,一种方法是用数组 ...

  4. 数据结构----栈stack

    栈的概念与数据结构 栈(有时称为“后进先出栈”)是一个元素的有序集合,其中添加移除新元素总发生在同一端.这一端通常称为“顶部”.与顶部对应的端称为“底部”.栈的底部很重要,因为在栈中靠近底部的元素是存 ...

  5. [C++][数据结构]栈(stack)的实现

    对于栈的定义,前人之述备矣. 我实现的是一个stack<value>容器类,支持push,pop,top,size,empty,clear和copy construction操作. 主要的 ...

  6. python基本数据结构栈stack和队列queue

    1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...

  7. (ACM模板)栈stack

    #include<iostream> #include<cstdio> #include<stack> using namespace std; stack< ...

  8. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  9. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

随机推荐

  1. ①将SVN迁移到GitLab-单分支迁移

    将SVN上的代码迁移到GitLab上,实际原理是将所迁移的服务器上,拷贝SVN上的相关代码,在服务器上生成Git相关仓库,然后推送到GitLab仓库,并保存SVN相关的提交记录,分支,标签等信息. 一 ...

  2. Angular应用架构设计-3:Ngrx Store

    这是有关Angular应用架构设计系列文章中的一篇,在这个系列当中,我会结合这近两年中对Angular.Ionic.甚至Vuejs等框架的使用经验,总结在应用设计和开发过程中遇到的问题.和总结的经验, ...

  3. 用于RISC-V的Makefile示例

    # Initialize ASM For RISC-V .section .text.entry .option norvc .global _start .macro push_reg addi s ...

  4. Nginx的proxy buffer参数总结

    1. proxy_buffering 语法:proxy_buffering on|off 默认值:proxy_buffering on 上下文:http,server,location 作用:该指令开 ...

  5. JavaWeb开发回顾总结【不断更新中】

    1.Java语言编程 2.Servlet & JSP(JavaServer Pages) JSPGet方法中文乱码,以上是我的一篇解决Get方法的文章. 关于编码的约定,从项目的一开始就要规定 ...

  6. 使用protobuf (proto3, C++和go语言)

    在这里,我先讲述C++使用protobuf,之后,会补充使用go语言使用protobuf. 使用protobuf需要有如下步骤: 在.proto文件中定义消息(message)格式. 使用protob ...

  7. springboot2.1.3+spring-session2.1.4分库处理

    使用spring session框架来统一管理session,该框架支持jdbc.redis存储,使用非常简单,可以去官网查看文档一步步接入即可,官网文档如下:https://docs.spring. ...

  8. [转] 雷电三和typec傻傻分不清

    原文:https://club.lenovo.com.cn/thread-4921715-1-1.html 因为形状完全一致,所以很多人都误以为Type-C=雷电3. 实际上,雷电3只是采用了Type ...

  9. 安装CDH 5.15.1详解

    安装CDH 5.15.1详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.安装Cloudera Manager 和CDH 1>.登陆Cloudera Manager ...

  10. Apache的虚拟主机

    一.虚拟主机的分类 基于IP的虚拟主机:一台服务器,多个ip,搭建多个网站 基于端口的虚拟主机:一台服务器,一个ip,利用不同端口,搭建多个网站 基于域名的虚拟主机:一台服务器,一个ip,多个域名,搭 ...