题目大意:
现有一个栈,请你对它做出如下操作:
- PUSH x:将元素x入栈。
- POP:将栈顶元素出栈。
- REVERSE:将栈内元素翻转。
- QUERY:查询从栈顶元素开始到栈底元素的NAND和。
其中NAND的定义为:
- 0 nand 0 = 1
- 0 nand 1 = 1
- 1 nand 0 = 1
- 1 nand 1 = 0
解题思路:
对于操作1和操作2直接模拟就好了,费时的部分是剩余的两个操作。
考虑到n的范围最大取值为200000,我们可以开个400000的数组,取中间部分为初始起点,当进行操作3的时候直接将头对另一边进行1、2操作就好了。
观察这个nand运算我们发现,只要和0进行运算的,答案都变成了1,利用这一点我们可以记录0出现的位置,就是出现了0就将它存起来。我们可以也像上面那样进行记录,出于好写我这里直接用的deque。这样,每当查询时我们直接看存起来的0的位置,如果没有0那就数1的个数;如果有的话就看从头开始最后一个出现的0之后有多少个1。这里有个细节要注意,就是当只有1个0的时候,要特别判断一下。
Mycode:
1 |
|