题面:
Description
小Z是一个爱好数学的小学生。最近,他在研究一些关于整数数列的性质。
为了方便他的研究,小Z希望实现一个叫做“Open Continuous Lines Processor”的数列编辑器。
一开始,数列编辑器里没有数字,只有一个光标。这个数列编辑器需要支持五种操作。
• ( exttt{I}) x 在当前光标前插入数字 x。
• ( exttt{D}) 删除当前光标前的数字。
• ( exttt{L}) 光标向前移动一个数字。
• ( exttt{R}) 光标向后移动一个数字。
• ( exttt{Q k}) 设光标之前的数列是{a1,a2,……,an},输出第k位及之前最大的前缀和,保证k≤n。
Input
第一行包含一个数字 N ,表示操作的个数。
接下来包含 N 行,每行包含一条命令
Output
对于每个Q k 命令,输出一个整数表示这个操作的答案。
Sample Input
8
I 2
I -1
I 1
Q 3
L
D
R
Q 2
Sample Output
2
3
Data Constraint
【数据规模】 对于 50% 的数据,N ≤ 1000; 对于 80% 的数据,N ≤ 100000; 对于 100% 的数据,N ≤ 1000000,插入的数字绝对值大小不会超过 1000。
正文:
考试的时候是开了个双向链表存整个数列,再开两个指针分别指向整个链表第一个和光标前一个。但查询的时候很显然是( heta(n))的时间复杂度,会( ext{TLE})。
所以我们可以用到栈。开两个栈分别表示光标左边的数列(s1)和光标右边的数列(s2)。再开个数组(Max_k)表示第k位及之前最大的前缀和。
当执行( exttt{L})时,把栈顶的值移到另一个栈里。执行( exttt{R})时,把栈顶的值移到另一个栈里的同时,更新(Max),执行( exttt{D})时,直接删除(s1)栈顶。执行( exttt{I})时,入栈、更新(Max)。输出时直接返回(Max_k)就好了。