HDOJ4699(对顶栈)

#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn=1000000;

int Q1[maxn];
int Q2[maxn],r1,r2;
int sum[maxn],dp[maxn];

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
    memset(Q1,0,sizeof(Q1));
    memset(Q2,0,sizeof(Q2));
    memset(sum,0,sizeof(sum));
    memset(dp,0,sizeof(dp));
    dp[0]=-(1<<29);
    r1=r2=0;
    char c;
    char p[10];
    int num;
    while(n--){
        scanf("%s",p);
        c=p[0];
        if(c==‘I‘){
            scanf("%d",&num);
            Q1[++r1]=num;
            sum[r1]=sum[r1-1]+num;
            dp[r1]=max(dp[r1-1],sum[r1]);
        }
        else if(c==‘D‘){
            if(r1==0) continue;
            r1--;
        }
        else if(c==‘L‘){
            if(r1==0) continue;
            Q2[++r2]=Q1[r1];
            r1--;
        }
        else if(c==‘R‘){
            if(r2==0) continue;
            num=Q2[r2--];
            Q1[++r1]=num;
            sum[r1]=sum[r1-1]+num;
            dp[r1]=max(dp[r1-1],sum[r1]);
        }
        else{
            scanf("%d",&num);
            printf("%d\n",dp[num]);
        }
    }
 }
return 0;
}

原文地址:https://www.cnblogs.com/lmjer/p/8974524.html

时间: 2024-11-15 06:25:38

HDOJ4699(对顶栈)的相关文章

HDU 4699 - Editor - [对顶栈]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 Problem Description Sample Input8I 2I -1I 1Q 3LDRQ 2 Sample Output23 Hint 题意: 维护一个整数序列的编辑器,有以下五种操作,操作总数不超过 $10^6$. $I \: x$:在当前光标位置之后插入一个整数 $x$,插入后光标移动到 $x$ 之后: $D$:删除光标前的一个整数: $L$:光标左移一格: $R$:光标右移一

HDOJ 4699 Editor 对顶栈

编辑器 Editor Time Limit: 1Sec Memory Limit: 128 MB Sample Input 8I 2I -1I 1Q 3LDRQ 2 Sample Output 2 3 Hint The following diagram shows the status of sequence after each instruction: 分析: 最开始考虑到多次的插入.删除,我使用的链表. 但是由于涉及到求最大前缀和,每次都扫一遍会超时,于是学到了一种新方法:对顶栈,即指,

浅谈栈

所谓栈,就是一种先进后出的数据结构. 何为先进后出?想象一个箱子,你往箱底塞了一本语文书,然后往语文书上放数学书.假设箱子底面积与书的面积相同,那么你想把先放进去的语文书拿出来,就必须得先把放在上面的数学书拿出来.所以"先进"的语文书与数学书比较是"后出"的. 在代码中一个栈由一个数组\(stk\)和一个变量\(top\)组成,数组存信息,\([1,top]\)的空间都被占用了,下一次放元素就只能放在\(top+1\)这个位置然后让\(top=top+1\).拿元素

栈专题练习

HDU4699 Editor 使用"对顶栈",维护一下前缀和和最大前缀和就行了. 时间复杂度\(O(Q)\) #include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ rg T data=0,w=1; rg char ch=getchar(); while(!isdigit(ch)){ if(ch=='-

信息学竞赛知识点一览

C++语言 基础算法 位运算 快速幂 模拟 枚举 递推 递归 分治 二分 三分 排序 归并排序 离散化 倍增 贪心 高精度 数据结构 前缀和 差分 栈 对顶栈 单调栈 队列 双端队列 循环队列 单调队列 ST表 链表 链式前向星 Hash表 二叉堆 Huffman树 并查集 路径压缩 按秩合并 扩展域 边带权 树状数组 线段树 延迟标记 扫描线 动态开点线段树 分块 莫队 点分治 BST 平衡树 Treap Splay 红黑树 AVL SBT 替罪羊树 LCT CDQ分治 三维偏序 整体二分 可

七方件业金离以提领前群约会ODjdidtlwfWv

为了从不同环节,尤其与广大使用人群直接关系的环节反映质量状况,对共享自行车投放点.运营仓库.生产企业等不同环节的产品抽查,覆盖了共享自行车从成品出厂到待投放的关键环节. 该负责人称,根据新车投放情况,结合共享自行车行业市场占有分布特点,本次重点抽查了摩拜.ofo.Hellobike三个品牌的产品,占本次抽查批次总数的83.3%.其中,在天津.无锡.武汉.广州.深圳.东莞6个城市抽查了9批次摩拜产品,占产品抽查批次总数的37.5%,抽查批次合格率88.9%,抽查不合格的1批次产品为待投放于广州市的

STL队列、优先队列、栈

STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素个数 top() 返回优先队列对顶元素 在默认的优先队列中,优先级高的先出队.在默认的int型中先出队的为较大的数. 使用方法: 头文件: #include <queue> 声明方式: 1.普通方法: priority_queue<int>q;//通过操作,按照元素从大到小的顺序出队

STL中栈和队列的使用方法

 STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素个数 top() 返回优先队列对顶元素 在默认的优先队列中,优先级高的先出队.在默认的int型中先出队的为较大的数. 使用方法: 头文件: #include <queue> 声明方式: 1.普通方法: priority_queue<int>q; //通过操作,按照元素从大到小的顺

栈与队列小结

存在问题: 1.对于简单的问题,因为思维惯性,常常更愿意用旧的方法去解决,从而导致无法熟悉站与队列的实现. 2.拿到题目时,常常会急着下手,而没有一个十分明确的算法,导致代码看起来思路十分混乱. 3.编程习惯不够好,缩进有问题,所用字符可读性不强. 总结: 栈分为顺序栈和链栈,实际上只是在原有数据存放空间基础上加上基指针和顶指针,通过对顶指针的操作实现先进后出的数据增减操作. 队列分为顺序队列和链式队列,实际上是在原有数据存放空间基础上加上头指针和尾指针,通过对头指针的操作实现出队,对尾指针的操