题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699

Problem Description

Sample Input
8
I 2
I -1
I 1
Q 3
L
D
R
Q 2

Sample Output
2
3

Hint

题意:

维护一个整数序列的编辑器,有以下五种操作,操作总数不超过 $10^6$。

$I \: x$:在当前光标位置之后插入一个整数 $x$,插入后光标移动到 $x$ 之后;

$D$:删除光标前的一个整数;

$L$:光标左移一格;

$R$:光标右移一格;

$Q \: k$:即 $S_i$ 为前 $i$ 个整数的和,查询 $S_1, S_2, \cdots, S_k$ 中的最大值。

题解:

已知 I,D,L,R 这四种操作都是在光标位置处发生,且操作完光标最多移动一个位置,因此可以用对顶栈的做法。

顾名思义,我们以光标为分界,分成左右两段序列分别由两个栈 $A,B$ 来维护,两个栈的栈顶相对。

同时我们可以开一个 $sum$ 数组来维护栈 $A$ 的前缀和,在开一个 $mx[i]$ 数组来保存 $sum[1], sum[2], \cdots, sum[i]$ 中的最大值。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
const int INF=0x3f3f3f3f; stack<int> A,B;
int sum[maxn],mx[maxn];
void update()
{
int p=A.size();
sum[p]=sum[p-]+A.top();
mx[p]=max(mx[p-],sum[p]);
}
int main()
{
int q;
while(cin>>q)
{
sum[]=;
mx[]=-INF;
while(!A.empty()) A.pop();
while(!B.empty()) B.pop();
while(q--)
{
char op[]; int k;
scanf("%s",op);
switch(op[])
{
case 'I':
scanf("%d",&k);
A.push(k);
update();
break; case 'D':
A.pop();
break; case 'L':
if(A.empty()) break;
B.push(A.top()); A.pop();
break; case 'R':
if(B.empty()) break;
A.push(B.top()); B.pop();
update();
break; case 'Q':
scanf("%d",&k);
printf("%d\n",mx[k]);
break;
}
}
}
}

HDU 4699 - Editor - [对顶栈]的更多相关文章

  1. hdu 4699 Editor 模拟栈

    思路:刚开始用STL中的栈,一直RE……,之后改为手动模拟栈操作,在注意点细节就可以了!!! 代码如下: #include<cstdio> #include<cstring> ...

  2. HDU 4699 Editor 维护栈

    维护两个栈,分别存光标前和光标后的数 再维护前缀和的栈 和 前缀和最大值的栈 注意一下左移,右移,删除到顶了就不操作了 5个操作 I x : 光标处插入x  -----> s1.push(x) ...

  3. HDOJ 4699 Editor 对顶栈模拟

    Editor Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm ...

  4. [置顶] hdu 4699 2个栈维护 or 伸展树

    hdu 4699  Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和.. 注意这里的k是在光标之前的, ...

  5. HDU 4699 Editor(模拟 对顶栈)

    题目大意: 给定一个整数序列 维护5种操作 次数<1e6 I x: 光标位置插入x 然后光标位于x之后 D: 删除光标前一个数 L: 光标左移 R: 光标右移 Q k: 询问位置k之前的最大前缀 ...

  6. Codeforces 670E - Correct Bracket Sequence Editor - [对顶栈]

    题目链接:https://codeforces.com/contest/670/problem/E 题意: 给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号). 有如下操作: 1.往 ...

  7. HDU 4699 Editor (2013多校10,1004题)

    Editor Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

  8. HDU 4699 Editor(双向链表)

    双向链表直接模拟. 用一个辅助数组maxSum来维护一下前k项中[1,k]的最大和. 因为光标是一格一格的移动,所以每次光标右移的时候动态更新一下即可. 时间复杂度O(n). #include < ...

  9. HDU—4699 Editor 双向链表+子集和

    惨.今天聪哥选了2013 多校10做训练,结果一题都没做出来.这个题目是数据结构,正好是我强项 如果只是插入 删除 光标左右移动,那都小菜,用链表全解决,关键是那个Q k 要求 a1到aq的连续子序列 ...

随机推荐

  1. C#通过DSOFile读取与修改文件的属性

    搜了一圈用C#读取与修改文件属性的文章,结果几乎找不到- -: 偶然间看到一个DSOFile工具,然后找到了对该工具进行详细讲解的一篇文章:<DSOfile,一个修改windows系统文件摘要的 ...

  2. Atitit xml框架类库选型 attilax总结

    Atitit xml框架类库选型 attilax总结 1. 1. XML类库可以分成2大类.标准的.这些类库通常接口和实现都是分开的1 2. Jdom 和dom4j1 2.1. 5.1. jdom1 ...

  3. Vert.x 示例

    //filename: MainVerticle.java package io.vertx.guides.wiki; import io.vertx.core.AbstractVerticle; i ...

  4. 【C语言】两个指针(地址)相减

    两个指针相减,为两个指针之间间隔这两个指针类型的数目. 如:int *p,*q; p-q=(p地址-q地址)/sizeof(int) #include <stdio.h> int main ...

  5. ASP.NET Core Razor Pages

    Razor 页面是Asp.Net Core2.0新增的一个功能.Razor 页面是 ASP.NET Core MVC 的一个新特性,它可以使基于页面的编码方式更简单高效. 环境:vs2017 .net ...

  6. iOS应用开发,全局强制竖屏,部分页面允许旋转的处理

    目前大多数app都不支持横屏模式,用户不常用,开发起来也麻烦一些.但有些时候,又离不开横屏和竖屏的切换,比如查看视频.图片.文档等,这时又不得不对页面做横屏的处理.下面来教大家如何处理这种场景,方法可 ...

  7. iOS系统及客户端软件测试的基础介绍

    iOS系统及客户端软件测试的基础介绍 iOS现在的最新版本iOS5是10月12号推出,当前版本是4.3.5 先是硬件部分,采用iOS系统的是iPad,iPhone,iTouch这三种设备,其中iPho ...

  8. Eclipse 4.4(luna) 安装Veloeclipse 2.0.8时报错的问题

    在Eclipse下编辑Velocity模板的插件,支持语法着色,代码向导等功能,简单好用,没有可视化编辑. Eclipse的更新地址是:http://veloeclipse.googlecode.co ...

  9. Mysql 查询decimal 引号‘’增加精度

    sql 通过decimal条件查询添加和不添加引号的区别 SELECT * FROM meta_variable WHERE DataTableID = 123456 # decimal类型 AND ...

  10. Java8学习笔记(八)--方法引入的补充

    在Java8学习笔记(三)--方法引入中,简要总结了方法引入时的使用规则,但不够完善.这里补充下几种情况: 从形参到实例方法的实参 示例 public class Example { static L ...