HDU 4699 Editor【模拟栈】
反正当时是没有想到怎么做,但发现用栈模拟后就有思路了。
题意就是找光标前的位置的最大前缀和,那最朴素的实现就是拿数组模拟,每一次insert和delete都重新更新一下maxprev和sum和整个序列的值;后来发现maxprev和sum不用每次都更新,而是只要保证光标pos位置前的值都对就可以了(因为询问只关心了前pos位的最大前缀和),但即便是这样还是得O(n)更新insert的delete(因为要维护a数组)。
这个时候就要有stack的思想了,s1栈从底下到上面为1到光标之间的数,然后s2从最上面到最底下是从光标后一位到序列的最后一个数。
所以就能做到O(1)更新了。
1.注意下用了关同步的优化就不能用scanf,printf;不然会出现说不清楚的错误
2.输入用char不用char数组的话小心换行符
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<map> #include<iomanip> #include<algorithm> #include<vector> #define INF 2e9 #define maxnode 100000 #define ll long long #define lowbit(x) (x&(-x)) int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; using namespace std;int maxprev[1000005],sum[1000005]; stack<int> s1,s2;int main(){//ios::sync_with_stdio(false);int q;while( ~scanf("%d",&q) ){int pos=0,len=0;maxprev[0]=-INF; //memset(maxprev,0,sizeof(maxprev));//memset(sum,0,sizeof(sum));while( !s1.empty() ) s1.pop();while( !s2.empty() ) s2.pop(); //s1里面存cursor前的数//s2里面存cursor后的数//任意时刻maxprev[pos]和sum[pos]都是合法的 for(int i=1;i<=q;i++){char op[5]; scanf("%s",op);if( op[0]=='I' ){int num; scanf("%d",&num);s1.push( num ); //把num放在s1的首 pos++;sum[pos]=sum[pos-1]+num;maxprev[pos]=max( maxprev[pos-1],sum[pos] );}else if( op[0]=='D' ){s1.pop(); pos--;}else if( op[0]=='L' ){if( s1.empty() ) continue;pos--;int tmp=s1.top(); s1.pop(); s2.push(tmp);//不用计算新的maxprev }else if( op[0]=='R' ){if( s2.empty() ) continue;int tmp=s2.top(); s2.pop(); s1.push(tmp);sum[pos+1]=sum[pos]+s1.top();maxprev[pos+1]=max( maxprev[pos],sum[pos+1] ); pos++;}else if( op[0]=='Q' ){int k; scanf("%d",&k);printf("%d\n",maxprev[k]);}}}return 0; }
转载于:https://www.cnblogs.com/ZhenghangHu/p/9759435.html
HDU 4699 Editor【模拟栈】相关推荐
- hdu 4699 Editor(splay tree 伸展树)
hdu 4699 Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和.. 解题思路:标乘是用了栈进行维 ...
- hdu 4699 2个栈维护 or 伸展树 (2013多校联合)
hdu 4699 Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求1到k位置的最大的前缀和.. 注意这里的k是在光标之前的 ...
- hdu 4699 Editor(Splay)
题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和. Splay在比赛的时候写得太Navie,T了整场. 左移和右移的 ...
- SCU4438 Censor(审查员) (KMP算法与模拟栈的应用 || HASH表与模拟栈的结合)
Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text pp. Her j ...
- 六、使用数组模拟栈的思路及代码实现
使用数组模拟栈的实现过程 1.栈的介绍 (1) 栈的英文为(stack) (2) 栈是一个先入后出(FILO-First In Last Out)的有序列表. (3) 栈(stack)是限制线性表中元 ...
- 第一回写的用arraylist模拟栈操作
package hashMap; import java.util.ArrayList; import d.Student; /*** 用ArrayList模拟栈操作* @author zhujiab ...
- 032_使用ArrayDeque模拟栈结构
import java.util.ArrayDeque; import java.util.Iterator;/*** 使用ArrayDeque模拟栈结构*/ public class DequeSt ...
- 数组模拟栈和队列板子
使用数组模拟数据结构栈和队列 栈:后进先出 对于栈:我们使用tt表示栈顶的下标,如果tt==0表示栈空 队列:先进先出 对于队列,我们使用hh表示队首,tt表示队尾,tt初始化为-1,判断队列是否为空 ...
- Leetcode402 remove-k-digits贪心+vector模拟栈的思想
题目 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示例 1 : 输入: ...
- CCF-CSP 201903-2 二十四点 Python语言 模拟栈实现
项目场景: 二十四点问题本质是处理表达式,一提到处理表达式第一反应大概就是使用栈来处理,虽然网上大部分使用python语言处理二十四点问题都是利用强大的eval()函数,但我仍然想要使用python的 ...
最新文章
- NeurIPS 2020不用抢票了!官方宣布改线上举办,网友:nice!已白嫖3个顶会
- Python SQLAlchemy
- 笔记本电脑没有鼠标怎么拖动_适合办公鼠标要如何选择?除了便携更需要这些...
- “跳过更新”还得付费?Docker 新变化引发群嘲
- 使用Python教你秒搭本地服务器
- 使用接口接收json数据
- matlab 去掉相同的行数据库,关于UCI数据库每行数据列数不一致的处理代码
- SPSS统计描述分析
- lua牛牛算法和大小比较
- XSS进阶二 ——合天网安实验室学习笔记
- Win10下的WSL(Linux子系统)开发环境搭建(PHP+Nginx+Mysql+Composer)
- 嵌入式软件工程师面试题及答案
- 分享一个超级狠的面试题与经验
- server 2008 r2 怎么打开任务管理?
- stm32h743外部RAM非字节对齐访问,引起的hard fault
- Salesforce开发教程(上下)
- Dubbo线程池满导致宕机的案例分析解决
- 利用Tensorflow构建RNN实现垃圾邮件分类
- 如何本地安装微擎系统
- Commit cannot be completed since the group has already rebalanced and assigned the
热门文章
- 2019各种比赛总结
- 评论:中国网络游戏虚拟物品交易的前景
- 小红帽linux各功能中英,英文短剧lbrack;小红帽rsqb;剧本台词完整版---中英对照文本版...
- 如何在Linux中克隆一个分区或者硬盘驱动器
- html 鼠标放上去变色,css3 鼠标经过div背景变色
- python 实现QQ邮箱发送邮件
- (翻译)用户友好的表格的9种设计技巧
- linux recovery模式是什么,recovery.img是什么
- 拍摄须知ISO、快门、光圈、曝光概念
- 斗鱼弹幕服务器连接协议,斗鱼弹幕服务器第三方接入协议v1 6 2.pdf