hdu4699Editor
来源:互联网 发布:linux c语言遍历目录 编辑:程序博客网 时间:2024/06/05 09:29
题目请戳这里
题目大意:给5种操作:
I x:当前光标出插入x;
D:删除当前光标位置前的一个数;
L:光标左移一位直至不能左移为止;
R:光标右移一位直至不能右移为止;
Q x:前x个数中的前缀和的最大值;
题目分析:这是昨天多校最后一场的一个题。这题跟去年网络赛一道题目基本一样,操作还简单些。
看到这题后直接联想到那道题了,但是对于Q操作,没想到好的解决办法,然后就脑残的来撸splay。。。然后就走上了悲剧的不归路。。。
其实解决Q操作也十分简单。只需要一个sum维护光标前面的数的和即可,因为是求前缀和的最大值,直接统计就可以了。
剩下的嘛,2个栈对弹即可。
这题splay会退化成链表,所以速度会很慢,这题的测试数据也比较强,所以splay很容易超时。
Orz那些splay能过的。。。。
详情请见代码:
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 1000005;const int INF = 0x3f3f3f3f;struct sta{ int head; int lcm[N]; void init(){head = 0;} int top() { return lcm[head]; } void pop() { head --; } void push(int a) { lcm[++ head] = a; }}stack[2];int q;int dp[N],sum;int main(){ int x; char op[4]; while(~scanf("%d",&q)) { stack[0].init(); stack[1].init(); memset(dp,0,sizeof(int)*q); dp[0] = -INF; sum = 0; while(q --) { scanf("%s",op); switch(*op) { case 'I':scanf("%d",&x); stack[0].push(x); sum += x; dp[stack[0].head] = max(dp[stack[0].head - 1],sum); break; case 'D':sum -= stack[0].top(); stack[0].pop(); break; case 'L':if(stack[0].head) { sum -= stack[0].top(); stack[1].push(stack[0].top()); stack[0].pop(); } break; case 'R':if(stack[1].head) { sum += stack[1].top(); stack[0].push(stack[1].top()); dp[stack[0].head] = max(dp[stack[0].head - 1],sum); stack[1].pop(); } break; case 'Q':scanf("%d",&x); printf("%d\n",dp[x]); } } } return 0;}//406MS7688K
- hdu4699Editor
- HDU4699Editor
- android SQLiteDatabase attempt to re-open an already-closed object:
- unix学习笔记---解释器文件(interpreter file)
- Android应用自动更新功能的代码实现
- Erlang编程实战2
- IE7下当position:fixed遇到text-align:center的解决方法
- hdu4699Editor
- Hibernate Session篇--Hibernate的缓存及对象的状态
- Flex textInput图角特效
- Invalid project description
- C++11 理解 (十九) 之 使用或禁用对象的默认函数
- 汇编里面的for循环
- 求一个字符串中连续出现次数最多的子串
- uva 1407 Caves (树形背包dp)
- mybatis 官方文档查看