HDU4699 Editor

知识点:栈

这个题属于稍微难一点的,首先我们根据这个题是在序列的中间进行操作,那么可以想到使用对顶栈,类似于对顶堆的写法,两个栈就是第一个是从序列的开头到光标,第二个是从序列的光标到结尾,栈顶都是光标的方向,那么这里需要注意的就是栈的细节,我们搞清楚光标左边光标右边是什么意思,这个看原题的样例就行了,然后就是最后的输出答案,首先把这个输出答案是什么意思搞懂,它这里的前缀是严格从1开始的,也就是说如果输入是5的话,那么就是从1到1,1到2,1到3等等,这5个前缀里面找出最大的,那么显然的,我们要开一个数组来记录前缀和,然后再开一个数组,f[5]的意思就是前5个前缀和里面的最大值,这样查询的时候我们直接输出就行了,

想了想,感觉这个题是可以用对顶栈做,但不是必须用对顶栈做,队列就不说了,感觉链表也是可以的啊,但是现在还没看到链表那里,等看到的时候用链表来写写

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
const int Inf = 1e9 + 5;

int L[N], R[N], a[N], b[N];

int main() {
	int q;
	while (cin >> q) {
		int cnt1 = 0, cnt2 = 0;
		for (int i = 0; i < N; i++) b[i] = -Inf;
		while (q--) {
			char op;
			getchar();
			scanf("%c", &op);
			int x;
			if (op == 'I') {
				scanf("%d", &x);
				L[++cnt1] = x;
				a[cnt1] = a[cnt1 - 1] + x;
				b[cnt1] = max(b[cnt1 - 1], a[cnt1]);
			} else if (op == 'D') {
				if (cnt1) cnt1--;
			} else if (op == 'L') {
				if (cnt1) R[++cnt2] = L[cnt1--];
			} else if (op == 'R') {
				if (cnt2) {
					L[++cnt1] = R[cnt2--];
					a[cnt1] = a[cnt1 - 1] + L[cnt1];
					b[cnt1] = max(b[cnt1 - 1], a[cnt1]);
				}
			} else {
				scanf("%d", &x);
				printf("%d\n", b[x]);
			}
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值