L学长非常喜欢栈, 一开始学长有一个为空的栈,进行q次操作,操作分为以下四种: 1.在栈顶放入一个元素x 2.删除栈顶元素(数据保证此时栈内至少有一个元素) 3.查询栈顶元素 4.将栈顶的k个元素修改成他们的最大公约数(数据保证k不超过栈中元素数量)(比如栈内元素是4,2,将栈顶的2个元素修改成他们的最大公约数,栈内元素是2,2) 输入 第一行一个正整数q, 接下来的q行,每行包括一到两个整数,第一个整数op表示操作类型: 当op = 1时,该行会有第二个整数x,表示在栈顶放入元素x 当op = 2时,该行只有一个整数op,表示删除此时栈顶的元素(数据保证此时栈内至少有一个元素) 当op = 3时,该行只有一个整数op,此时你需要输出栈顶的元素 当op = 4时,该行会有第二个整数k,表示在将栈顶的k个元素修改成他们的最大公约数(数据保证k不超过栈中元素数量) 对于100%的数据,1 <= q <= 200000,1 <= x <= 100000000 输出 当 op == 3 时输出栈顶元素
时间: 2024-02-12 11:06:47 浏览: 142
可以使用栈来模拟这些操作。需要注意的是,当进行操作 4 的时候,可能会将栈中的元素删除,因此需要先将要修改的元素暂存起来,再重新压入栈中。
具体实现如下:
```python
from math import gcd
def solve(q, queries):
stack = []
for i in range(q):
op = queries[i][0]
if op == 1:
x = queries[i][1]
stack.append(x)
elif op == 2:
stack.pop()
elif op == 3:
print(stack[-1])
elif op == 4:
k = queries[i][1]
temp = []
for _ in range(k):
temp.append(stack.pop())
g = gcd(*temp)
stack.append(g)
for i in range(k-1):
stack.append(temp.pop())
return
```
其中,q 是操作次数,queries 是一个二维列表,表示每个操作。每个操作是一个一维列表,第一个元素是操作类型,后面可能有一个整数参数。输出操作 3 的结果即可。
时间复杂度为 $O(qk \log n)$,其中 $k$ 是操作 4 中的参数,$n$ 是元素的最大值。
阅读全文