洛谷P2201 数列编辑器

洛谷 P2201 数列编辑器

题目描述

小Z是一个爱好数学的小学生。最近,他在研究一些关于整数数列的性质。

为了方便他的研究,小Z希望实现一个叫做“Open Continuous Lines Processor”的数列编辑器。

一开始,数列编辑器里没有数字,只有一个光标。这个数列编辑器需要支持五种操作。

• I x 在当前光标前插入数字 x。

• D 删除当前光标前的数字。

• L 光标向前移动一个数字。

• R 光标向后移动一个数字。

• Q k 设光标之前的数列是{a1,a2,……,an},输出第k位及之前最大的前缀和,保证k≤n。

输入格式

第一行包含一个数字 N ,表示操作的个数。

接下来包含 N 行,每行包含一条命令。

输出格式

对于每个Q k 命令,输出一个整数表示这个操作的答案。

输入输出样例

输入 #1复制

1
2
3
4
5
6
7
8
9
8
I 2
I -1
I 1
Q 3
L
D
R
Q 2

输出 #1复制

1
2
2
3

说明/提示

【数据规模】

对于 50% 的数据,N ≤ 1000;

对于 80% 的数据,N ≤ 100000;

对于 100% 的数据,N ≤ 1000000,插入的数字绝对值大小不会超过 1000。


用两个栈来表示光标的左侧和右侧,L时Left栈出栈,Right栈进栈,反之亦然。同时维护一个前缀和数组和一个前缀和最大值的数组。只有当Left栈进栈新的元素后才需要更新这两个数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;

stack<int> Left, Right;
int pre[1000010] = {0}, N, preMax[1000010] = {0};

int main(int argc, const char * argv[])
{
int N;
cin >> N;
preMax[0] = -0x7fffffff;
for(int i = 0; i < N; i++)
{
char op;
cin >> op;
if(op == 'I')
{
int temp;
cin >> temp;
Left.push(temp);
pre[Left.size()] = pre[Left.size() - 1] + Left.top();
preMax[Left.size()] = max(preMax[Left.size() - 1], pre[Left.size()]);
}
else if(op == 'D')
Left.pop();
else if(op == 'L')
{
Right.push(Left.top());
Left.pop();
}
else if(op == 'R')
{
Left.push(Right.top());
Right.pop();
pre[Left.size()] = pre[Left.size() - 1] + Left.top();
preMax[Left.size()] = max(preMax[Left.size() - 1], pre[Left.size()]);
}
else if(op == 'Q')
{
int temp;
cin >> temp;
cout << preMax[temp] << endl;
}
}

return 0;
}
作者

Jhuoer Yen

发布于

2021-04-07

更新于

2023-09-18

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×