题目大意:

给定一个整数序列 维护5种操作 次数<1e6

I x: 光标位置插入x 然后光标位于x之后

D: 删除光标前一个数

L: 光标左移

R: 光标右移

Q k: 询问位置k之前的最大前缀和

选用"对顶栈"的做法 大致示意图如下:

对顶栈stkl, stkr直接通过数组模拟即可实现

以I x的操作为例, 需要:

1)将x插入stkl;

2)更新s数组 当前的前缀和 = 之前的前缀和 + x

3)更新f数组 记录该位置的最大前缀和

故有如下的代码:

// tl用于记录左栈的栈顶位置
void push_left(int x) {
stkl[++tl] = x;
s[tl] = s[tl-] + x;
f[tl] = max(f[tl-], s[tl]);
}

对于D操作 直接将左栈栈顶出栈 即--tl;

对于L 左栈弹出 压入右栈

对于R 弹出右栈 剩下操作同I x的2) 3)

对于Q k return f[k]即可

完整代码如下:

#include <bits/stdc++.h>
using namespace std; const int N = 1e8 + ; int stkl[N], stkr[N], tl, tr;
int s[N], f[N]; // s维护当前前缀和 f维护当前最大前缀和
char str[]; void push_left(int x) {
stkl[++tl] = x;
s[tl] = s[tl-] + x;
f[tl] = max(f[tl-], s[tl]);
} int main() {
int n;
while(~scanf("%d", &n)) {
f[] = INT_MIN;
tl = tr = ;
s[] = ;
while(n--) {
scanf("%s", str);
int x;
if(*str == 'I') {
scanf("%d", &x);
push_left(x);
}
if(*str == 'D') {
if(tl > ) tl--;
}
if(*str == 'L') {
if(tl > ) stkr[++tr] = stkl[tl--];
}
if(*str == 'R') {
if(tr > ) push_left(stkr[tr--]);
}
if(*str == 'Q') {
scanf("%d", &x);
printf("%d\n", f[x]);
}
}
}
}

这里注意一下每次的初始化即可

        f[0] = INT_MIN;
tl = tr = 0;
s[0] = 0;

HDU 4699 Editor(模拟 对顶栈)的更多相关文章

  1. hdu 4699 Editor 模拟栈

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

  2. HDU 4699 - Editor - [对顶栈]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 Problem Description Sample Input8I 2I -1I 1Q 3LD ...

  3. HDU 4699 Editor 维护栈

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

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

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

  5. HDU 4699 Editor(双向链表)

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

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

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

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

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

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

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

  9. Python模拟入栈出栈操作

    目标: 1.编写菜单,提示用户操作选项(push,pop,view,quit) 2.规则:定义列表,先入栈,后出栈,后入栈,先出栈 1.模拟入栈.出栈操作 >>> list1 = [ ...

随机推荐

  1. java基础(八)之函数的复写/重写(override)

    复写的意思就是子类对父类的修改. 复写的条件: 1.在具有父子类关系的两个类当中:2.父类和子类各有一个函数,这两个函数的定义保持一致(返回值类型.函数名.参数列表) 还是老样子,3个文件来说明. P ...

  2. php对字符串的操作2之 处理字符串的内置函数

    1,获取字串:substr($str,$start,$length) mb_substr($str,$start,$length,'utf-8'); 更换为utf8编码,能准确的截取中文 <?p ...

  3. 同步块:synchronized(同步监视器对象){同步运行代码片段}

    package seday10; import seday03.Test2; /** * @author xingsir * 同步块:synchronized(同步监视器对象){需要同步运行的代码片段 ...

  4. 8.10-DayT3游走(wander)

    题目大意 lue.. 题解 先跑一遍tarjan缩点,在新图中加入两个强连通分量之间的边,则此图为一个有向无环图(DAG).则最终答案为1点所在的强连通分量或包括1点的几个强连通分量的点数之和. 如果 ...

  5. Linux下查看进程和端口信息

    1.根据进程名查看进程信息,以查看tomcat进程名为例,查看所对应的进程id为1095(或者使用: ps -aux | grep tomcat 查看占用内存等信息) ps -ef | grep to ...

  6. gulp 常用方法 任务 插件

    执行gulp 任务 gulp taskname (default任务不输入名称亦可:gulp) var gulp = require("gulp"); gulp.task(&quo ...

  7. Android学习15

    Date&Time DatePicker(日期选择器),TimePicker(时间选择器),CalendarView(日期视图): 1.TextClock TextClock可以以字符串格式显 ...

  8. Spring - Spring 常用注解

    概述 简单整理一些 Spring 的注解 这个算是一个 水一波 类型的整理 内容不全 分类可能有的地方不会太符合逻辑 而且时间也不太充裕 先把自己想写的写下来, 然后随缘整理吧 约定 版本 Sprin ...

  9. 【游戏体验】Shoot'm(暴打火柴人)

    >>>点此处可试玩无敌版<<< 注意,本游戏含有少量暴力元素,13岁以下的儿童切勿尝试本款游戏 生活有压力,学习不如意,你可以尝试这款游戏发泄心中的不满 个人测评 ...

  10. linux 配置LVM

    1. 阿里云挂载LVM目录(创建LVM,以及配置第一块硬盘) fdisk /dev/vdb 输入 n p 1 enter enter wq pvcreate /dev/vdb1 vgcreate lv ...