HDU 4699 Editor(模拟 对顶栈)
题目大意:
给定一个整数序列 维护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(模拟 对顶栈)的更多相关文章
- hdu 4699 Editor 模拟栈
思路:刚开始用STL中的栈,一直RE……,之后改为手动模拟栈操作,在注意点细节就可以了!!! 代码如下: #include<cstdio> #include<cstring> ...
- HDU 4699 - Editor - [对顶栈]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 Problem Description Sample Input8I 2I -1I 1Q 3LD ...
- HDU 4699 Editor 维护栈
维护两个栈,分别存光标前和光标后的数 再维护前缀和的栈 和 前缀和最大值的栈 注意一下左移,右移,删除到顶了就不操作了 5个操作 I x : 光标处插入x -----> s1.push(x) ...
- HDU 4699 Editor (2013多校10,1004题)
Editor Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- HDU 4699 Editor(双向链表)
双向链表直接模拟. 用一个辅助数组maxSum来维护一下前k项中[1,k]的最大和. 因为光标是一格一格的移动,所以每次光标右移的时候动态更新一下即可. 时间复杂度O(n). #include < ...
- HDU—4699 Editor 双向链表+子集和
惨.今天聪哥选了2013 多校10做训练,结果一题都没做出来.这个题目是数据结构,正好是我强项 如果只是插入 删除 光标左右移动,那都小菜,用链表全解决,关键是那个Q k 要求 a1到aq的连续子序列 ...
- [置顶] hdu 4699 2个栈维护 or 伸展树
hdu 4699 Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和.. 注意这里的k是在光标之前的, ...
- Codeforces 670E - Correct Bracket Sequence Editor - [对顶栈]
题目链接:https://codeforces.com/contest/670/problem/E 题意: 给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号). 有如下操作: 1.往 ...
- Python模拟入栈出栈操作
目标: 1.编写菜单,提示用户操作选项(push,pop,view,quit) 2.规则:定义列表,先入栈,后出栈,后入栈,先出栈 1.模拟入栈.出栈操作 >>> list1 = [ ...
随机推荐
- zabbix_agentd无法启动,cannot open log 错误
最近有一台服务器的zabbix启动异常,看日志有如下报错 zabbix_agentd []: cannot open log: cannot create semaphore ] No space l ...
- audio mixer
https://blog.csdn.net/jeffasd/article/details/77155187 https://blog.csdn.net/jeffasd/article/details ...
- android 使用系统级别权限
java.lang.SecurityException: Neither user 10027 nor current process has android.permission.MODIFY_PH ...
- monkey工具使用(未完待续)
monkey命令详解: 转自:http://blog.csdn.net/jlminghui/article/details/38238443 http://www.cnblogs.com/wfh198 ...
- 【网易官方】极客战记(codecombat)攻略-地牢-囚犯
关卡连接: https://codecombat.163.com/play/level/the-prisoner 解放囚犯,你会得到盟友. 简介 敬请期待! 默认代码 # 释放囚犯,击败守卫并夺取宝石 ...
- Collection两个常见的集合类型: ArrayList可重复集有序 ,HashSet不可重复集
package seday11; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; ...
- SqlDataAdapter对象
https://blog.csdn.net/qq_39657909/article/details/80615465 一.特点介绍 1.表示用于填充 DataSet 和更新 SQL Server 数据 ...
- bugku getshell
http://123.206.87.240:8002/web9/ 该题是walf严格匹配,通过修改Content-type后字母的大小写可以绕过检测, 然后还有,后缀黑名单检测和类型检测,逐个绕过,如 ...
- html标签的快捷
https://www.jianshu.com/p/8f330e3571ee 一: <ul> <li><a href=""></a> ...
- 040_字符串连接符 041_条件运算符目 042_运算符优先级_逻辑与或优先问题 043_自动类型转化 044_强制类型转换 045_基本类型常见错误_溢出_L问题
040_字符串连接符 package test_package; /** * 字符串运算符 * @author * */public class TestOperator05 { public sta ...