码迷,mamicode.com
首页 > 其他好文 > 详细

【Luogu P2182】【JZOJ 3922】数列编辑器

时间:2019-12-20 20:52:52      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:时间   实现   超过   复杂   前缀   code   正文   大小   out   

题面:

Description

小Z是一个爱好数学的小学生。最近,他在研究一些关于整数数列的性质。
为了方便他的研究,小Z希望实现一个叫做“Open Continuous Lines Processor”的数列编辑器。
一开始,数列编辑器里没有数字,只有一个光标。这个数列编辑器需要支持五种操作。
? \(\texttt{I}\) x 在当前光标前插入数字 x。
? \(\texttt{D}\) 删除当前光标前的数字。
? \(\texttt{L}\) 光标向前移动一个数字。
? \(\texttt{R}\) 光标向后移动一个数字。
? \(\texttt{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。

正文:

考试的时候是开了个双向链表存整个数列,再开两个指针分别指向整个链表第一个和光标前一个。但查询的时候很显然是\(\theta(n)\)的时间复杂度,会\(\text{TLE}\)

所以我们可以用到栈。开两个栈分别表示光标左边的数列\(s1\)和光标右边的数列\(s2\)。再开个数组\(Max_k\)表示第k位及之前最大的前缀和。

当执行\(\texttt{L}\)时,把栈顶的值移到另一个栈里。执行\(\texttt{R}\)时,把栈顶的值移到另一个栈里的同时,更新\(Max\),执行\(\texttt{D}\)时,直接删除\(s1\)栈顶。执行\(\texttt{I}\)时,入栈、更新\(Max\)。输出时直接返回\(Max_k\)就好了。

【Luogu P2182】【JZOJ 3922】数列编辑器

标签:时间   实现   超过   复杂   前缀   code   正文   大小   out   

原文地址:https://www.cnblogs.com/GJY-JURUO/p/12060909.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!