题意

现在要求模拟一个文档编辑,有5种操作,I x:在光标后面插入一个数字x,且光标后以一位,相当于输入;D:删除光标前面的一个数字,相当于backpack;L:将光标向左移动一位;R:光标向右移动一位;Q x:查询前x个数字的最大前缀和,保证x在光标位置之前。

分析

由于每次操作都是在光标所在的位置,而且只改变一位。所以我们可以用光标模拟栈顶指针,将光标左边的数字,也就是有效数字存进一个栈中。对于I操作,相当于将x压入栈,对于D操作相当于pop栈顶元素。最后的查询是要求最大的前缀和,而且他保证了查询的位置一定是在光标前,所以我们可以对光标前的数字,也就是栈中的数字建立前缀数组sum,并且用另一个数组dp记录从开始到当前位置中的最大前缀和,那么对于Q操作直接输出dp[x]即可。

还有剩下两个操作,左移和右移。因为左移以后的数字并不是被删除了,当右移的时候还需要重新利用,这个时候我们模拟下可以发现,右移的这个操作可以看成是另一个栈,每当右移的时候将原来栈顶的元素放在另一个栈中,然后左移的时候将另个栈的栈顶元素重新压回来。

最后说下sum数组和dp数组是如何建立的,因为要存的是栈中的数字,所以每当有入栈操作的时候就要计算前缀和以及更新dp数组。也就是I操作和R操作。

代码中还要注意一点的是,如果当前光标已经是第一个了,那么再往左边移动也是不变的,也就相当于,第一个栈的元素如果是空的话,是无法出栈的。同理当光标是最后一个位置的时候右移也是无法移动的,这相当于第二个栈如果是空的话,也是无法出栈的。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int MAXN = 1e6;
ll sum[MAXN + 5], dp[MAXN + 5];
int main()
{ios::sync_with_stdio(false);int n;while (cin >> n){memset(sum, 0, sizeof(sum));memset(dp, 0, sizeof(dp));dp[0] = -10000000000000000;string op;int x;stack<int> a, b;while (n--){cin >> op;if (op[0] == 'I'){cin >> x;a.push(x);int pos = a.size();sum[pos] = sum[pos - 1] + x;dp[pos] = max(dp[pos - 1], sum[pos]);}else if (op[0] == 'D'){a.pop();}else if (op[0] == 'L'){if (a.size()) {x = a.top();a.pop();b.push(x);}}else if (op[0] == 'R'){if (b.size()){x = b.top();b.pop();a.push(x);int pos = a.size();sum[pos] = sum[pos - 1] + x;dp[pos] = max(dp[pos - 1], sum[pos]);}}else{cin >> x;cout << dp[x] << endl;}}}return 0;
}

HDU 4699(栈)相关推荐

  1. hdu 4699 2个栈维护 or 伸展树 (2013多校联合)

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

  2. hdu 4699 Editor(splay tree 伸展树)

    hdu 4699  Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和.. 解题思路:标乘是用了栈进行维 ...

  3. Editor HDU 4699

    题目 #include <iostream> using namespace std;const int N = 1e6 + 10; int p[2], a[N], b[N], sum[N ...

  4. hdu 4699 Editor(Splay)

    题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和. Splay在比赛的时候写得太Navie,T了整场. 左移和右移的 ...

  5. HDU 4358 树状数组+思路

    http://acm.hdu.edu.cn/showproblem.php?pid=4358 如图所示,当k==3时,如果我们扫描到红线所在的位置. 则符合条件的区间就是从红线到两条紫线所包含的区间( ...

  6. POJ 1201 amp; HDU1384 amp; ZOJ 1508 Intervals(差分约束+spfa 求最长路径)

    题目链接: POJ:http://poj.org/problem?id=1201 HDU:http://acm.hdu.edu.cn/showproblem.php? pid=1384 ZOJ:htt ...

  7. java web自动生成编号_2013-8-6 10:56:07 JAVA_WEB:员工号自动生成源代码

    create table user_info_temp ( usId varchar2(20), usNo varchar2(20), usName varchar2(50) ) --oracle中如 ...

  8. HDU 1022[Train Problem I] 栈的应用

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 题目大意:一列序列为s1的车厢是否能通过车站的中转以序列s2出站.白皮上有. 关键思想:栈的应用 ...

  9. HDU多校4 - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?!(单调栈)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问给出一个区间 [l,r][l,r][l,r],要求输出区间 [l,r][l,r][l,r] 内 " ...

  10. HDU 3328 Flipper 栈 模拟

    HDU 3328 Flipper 栈 模拟 首先想说,英语太烂这题读了很长时间才读懂......题意是说输入有几张牌,然后输入这些牌的初始状态(是面朝上还是面朝下),然后输入操作方式,R表示翻一下右边 ...

最新文章

  1. 整个领域没了!学术界有史以来最大的丑闻
  2. 能够在Linux系统中运行的5款大型耐玩游戏
  3. mysql5.7和8.0的区别_Windows Terminal 1.0 和 Linux 版有啥区别
  4. Gerchberg–Saxton算法
  5. Mongodb-副本集
  6. 研究年轻用户的心理影响排名 Instagram最负面
  7. MyBatis中的@Mapper注解 @Mappe与@MapperScan关系
  8. 教你从进程中判断病毒木马的存在
  9. c 语言程序设计文献,c语言程序设计参考文献
  10. HUB、Switch、Router在OSI模型层次信息
  11. JSON 在线编辑器
  12. Android如何监听蓝牙耳机的按键事件
  13. 用GoldWave和剪映简单编辑视频
  14. word按标题自动生成序号
  15. 2019强网杯upload
  16. chosen插件使用
  17. 计算机房设备包含什么,机房设计常用计算公式有哪些
  18. 沈航计算机学院杨华,【沈航新青年·实践】电子信息工程学院“电信筑梦,科技振兴”暑期社会实践活动纪实...
  19. 修改STM32F030 时钟源为内部晶振(HEI )
  20. Android7.0 PackageManagerService (2) PKMS构造函数的主要工作

热门文章

  1. 香港自由行攻略(自用)
  2. 在CRA中自定义webpack
  3. 满满干货!15个经典面试问题及答案
  4. RS232串口的直连串口线和交叉串口线的区别
  5. HDU-3987 Harry Potter and the Forbidden Forest(最大流)
  6. 天马行空 PCI理解
  7. SimpleFOC调参1-力矩控制
  8. linux vga 驱动,Linux VGA驱动移植实验【转】
  9. 计算机网络 | IPv6 | 什么是IPv6
  10. 【机器学习面经】AI算法岗位简历必备