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

  题意:开始有一个光标,每次有5中操作:1,光标当前位置插入一个数,2,光标当前位置删除一个,3,光标向左移一位,4,光标向右移动一位,5,询问前面的数列的最大前缀和。

  由于每次删除的数都是在当前的光标位置,而且询问的前缀和都是在光标前面的位置,因此问题简化了很多,否则要用Splay tree搞了。我们可以直接用一个链表或者两个栈来维护光标以前的最大前缀和,然后直接模拟操作就可以了。。。

  1. //STATUS:C++_AC_671MS_10824KB
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. //#include <ext/rope>
  6. #include <fstream>
  7. #include <sstream>
  8. #include <iomanip>
  9. #include <numeric>
  10. #include <cstring>
  11. #include <cassert>
  12. #include <cstdio>
  13. #include <string>
  14. #include <vector>
  15. #include <bitset>
  16. #include <queue>
  17. #include <stack>
  18. #include <cmath>
  19. #include <ctime>
  20. #include <list>
  21. #include <set>
  22. #include <map>
  23. using namespace std;
  24. //using namespace __gnu_cxx;
  25. //define
  26. #define pii pair<int,int>
  27. #define mem(a,b) memset(a,b,sizeof(a))
  28. #define lson l,mid,rt<<1
  29. #define rson mid+1,r,rt<<1|1
  30. #define PI acos(-1.0)
  31. //typedef
  32. //typedef __int64 LL;
  33. //typedef unsigned __int64 ULL;
  34. //const
  35. const int N=;
  36. const int INF=0x3f3f3f3f;
  37. const int MOD=,STA=;
  38. //const LL LNF=1LL<<60;
  39. const double EPS=1e-;
  40. const double OO=1e15;
  41. const int dx[]={-,,,};
  42. const int dy[]={,,,-};
  43. const int day[]={,,,,,,,,,,,,};
  44. //Daily Use ...
  45. inline int sign(double x){return (x>EPS)-(x<-EPS);}
  46. template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
  47. template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
  48. template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
  49. template<class T> inline T Min(T a,T b){return a<b?a:b;}
  50. template<class T> inline T Max(T a,T b){return a>b?a:b;}
  51. template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
  52. template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
  53. template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
  54. template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
  55. //End
  56.  
  57. int sta1[N][],sta2[N];
  58. int n;
  59.  
  60. int main()
  61. {
  62. // freopen("in.txt","r",stdin);
  63. int i,j,a,top1,top2;
  64. char op[];
  65. while(~scanf("%d",&n))
  66. {
  67. top1=top2=;
  68. sta1[][]=-INF;
  69. while(n--){
  70. scanf("%s",op);
  71. if(op[]=='I'){
  72. scanf("%d",&a);
  73. sta1[++top1][]=a;
  74. sta1[top1][]=sta1[top1-][]+a;
  75. sta1[top1][]=Max(sta1[top1][],sta1[top1-][]);
  76. }
  77. else if(op[]=='D'){
  78. top1--;
  79. }
  80. else if(op[]=='L'){
  81. if(top1<)continue;
  82. sta2[++top2]=sta1[top1--][];
  83. }
  84. else if(op[]=='R'){
  85. if(top2<)continue;
  86. a=sta2[top2--];
  87. sta1[++top1][]=a;
  88. sta1[top1][]=sta1[top1-][]+a;
  89. sta1[top1][]=Max(sta1[top1][],sta1[top1-][]);
  90. }
  91. else {
  92. scanf("%d\n",&a);
  93. printf("%d\n",sta1[a][]);
  94. }
  95. }
  96. }
  97. return ;
  98. }

HDU-4699 Editor 数据结构维护的更多相关文章

  1. HDU 4699 Editor 维护栈

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

  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 (2013多校10,1004题)

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

  4. HDU 4699 Editor(双向链表)

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

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

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

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

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

  7. hdu 4699 Editor 模拟栈

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

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

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

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. Android Activity交互及App交互

    Android交互--------->Intent Activity之间----->Explicit Intent App之间--------->Implicit Intent

  2. CentOS 5: Make Command not Found

    在centos 5下安装软件遇到的问题,google了一圈,是因为系统没有安装编译器,那安装就是了,嘿嘿. 解决办法,在SSH下输入下面的命令 yum -y install gcc automake ...

  3. java 布尔值一种赋值方法

    在研读jmeter的代码时发现一个很常见的布尔值赋值方式,记录下来备忘: public static void main(String[] args) { // TODO Auto-generated ...

  4. [译]好程序员的五声“呐喊”

    通常编程情况下,会导致软件项目变坏的一些列反应 原文:The five shouts of good programmers 在任何一天,在这个世界上都有软件项目正在失败,这很常见.常见到当软件产品按 ...

  5. poj2352

    纪念树状数组初步(……): 这题已经给了y升序,y相同时x升序,(yeah) 所以容易想到O(n^2)的模拟算法: 其实分析一下就是对于当前xi,统计之前有多少个小于等于xi(因为已经保证了没有相同坐 ...

  6. mac osx 升级yosemite后java出错的解决

    原文  http://www.cnblogs.com/walkerwang/p/4034152.html

  7. jquery在线引用的地址

    1. 很多网站都是使用这种方式引入,客户的浏览器可能已经缓存过了 jquery.可以直接调用本地的,速度更快… 2. Google code 使用了 cdn 技术在很多地方有节点服务器,加载 jque ...

  8. WCF发布后远程访问的域名解析问题

    环境: VS2010 sp1,.net framework 4.0,windows server 2003 x64 ,iis 6.0 症状: WCF开发测试,本地调用都正常.发布后,在浏览器中访问ht ...

  9. Spring 教程(二)

    一.Spring AOP介绍 开发其实就是在不断的重构,抽象重复代码,然后进行封装.从最原始的模块化编程到面向对象编程,代码的封装越来越整齐清晰,但是依然存在重复的代码,而这些重复代码几乎都是与业务逻 ...

  10. MySQL性能指标及计算方法

    绝大多数MySQL性能指标可以通过以下两种方式获取: (1)mysqladmin 使用mysqladmin extended-status命令获得的MySQL的性能指标,默认为累计值.如果想了解当前状 ...