x = int(input()) nums = list(map(int, input().split())) n = nums[0] nums = nums[1:] mstk1, mstk2 = [], [] # 单调栈 l, r = [0] * len(nums), [0] * len(nums) # 左右边界数组 result = 0 for i in range(len(nums)): while mstk1 and nums[mstk1[-1]] >= nums[i]: mstk1.pop() if mstk1: l[i] = mstk1[-1] else: l[i] = -1 mstk1.append(i) for i in range(len(nums) - 1, -1, -1): while mstk2 and nums[mstk2[-1]] >= nums[i]: mstk2.pop() if mstk2: r[i] = mstk2[-1] else: r[i] = len(nums) mstk2.append(i) for i in range(len(nums)): result = max(result, (r[i] - l[i] - 1) * nums[i]) print(result)请给以上代码做代码注释
时间: 2024-01-20 18:02:11 浏览: 82
```
x = int(input()) # 输入测试用例数目
nums = list(map(int, input().split())) # 输入每个测试用例的数据
n = nums[0] # 第一个元素为该测试用例的数组长度
nums = nums[1:] # 去掉第一个元素,得到该测试用例的数组
mstk1, mstk2 = [], [] # 初始化两个单调栈
# l, r 分别为左右边界数组,初始化为 0
l, r = [0] * len(nums), [0] * len(nums)
result = 0 # 初始化最大面积为 0
# 遍历该测试用例的数组
for i in range(len(nums)):
# 维护单调递增的栈 mstk1,存储数组中元素的下标
while mstk1 and nums[mstk1[-1]] >= nums[i]:
mstk1.pop() # 如果栈顶元素大于等于当前元素,弹出该元素
if mstk1:
l[i] = mstk1[-1] # 如果栈非空,当前元素左边界为栈顶元素,否则左边界为 -1
else:
l[i] = -1
mstk1.append(i) # 将当前元素下标压入栈中
# 遍历该测试用例的数组(倒序遍历)
for i in range(len(nums) - 1, -1, -1):
# 维护单调递增的栈 mstk2,存储数组中元素的下标
while mstk2 and nums[mstk2[-1]] >= nums[i]:
mstk2.pop() # 如果栈顶元素大于等于当前元素,弹出该元素
if mstk2:
r[i] = mstk2[-1] # 如果栈非空,当前元素右边界为栈顶元素,否则右边界为数组长度
else:
r[i] = len(nums)
mstk2.append(i) # 将当前元素下标压入栈中
# 遍历该测试用例的数组,计算每个元素的最大矩形面积
for i in range(len(nums)):
result = max(result, (r[i] - l[i] - 1) * nums[i])
print(result) # 输出该测试用例的最大矩形面积
```
阅读全文