题目描述:
给定一个整数数组 arr,您需要处理多个查询。每个查询包含一个区间 [l,r],请您找出该区间内的最大值以及所有出现该最大值的下标序列。
输入:
输出:
对于每个查询,输出两行:
示例:
输入:
5
1 3 7 2 7
3
1 5
2 4
1 3
输出:
7
3 5
7
3
7
3
提示:
给定一个整数数组 arr
,需要处理多个区间查询。每个查询给定一个区间 [l, r]
,要求在该区间内找到最大值,并输出该最大值及其所有出现的下标(注意下标从1开始)。
这道题是最大值查询的扩展版本,不仅需要找到区间内的最大值,还需要记录所有出现该最大值的下标。由于题目数据范围较小,采用简单的三重循环即可解决。
具体步骤如下:
输入处理:
n
和数组元素。q
,然后依次处理每个查询。查询处理:
[l, r]
,并将其转换为0开始的索引。[l, r]
,找到最大值 max_value
以及所有等于 max_value
的下标。max_value
及其所有下标(1开始)。时间复杂度:
输入读取:
input()
和 map(int, input().split())
读取输入。n
为数组长度,arr
为数组元素列表。q
为查询次数,之后依次读取每个查询的 [l, r]
。查询处理:
[l, r]
转换为0开始的索引,以便于Python列表的索引操作。max_value
为区间的第一个元素,max_indices
为包含该元素下标的列表。[l, r]
,更新 max_value
和 max_indices
:
max_value
,更新 max_value
并重置 max_indices
。max_value
,将其下标加入 max_indices
。结果输出:
max_value
。' '.join(map(str, max_indices))
将下标列表转换为字符串,并打印。输入
5
1 3 3 2 5
3
1 5
2 4
3 5
输出
5
5
3
2 3
5
5
解释
[1,5]
:最大值为5,出现在下标5。[2,4]
:最大值为3,出现在下标2和3。[3,5]
:最大值为5,出现在下标5。input().split()
可以简化代码,适用于数据量较小的情况。如果数据量非常大,sys.stdin.readline()
会更高效,但根据题目要求,这里使用 input().split()
。这种方法适用于数据规模较小的情况。如果数据规模较大,可以考虑使用更高效的数据结构,如线段树或稀疏表(Sparse Table)来优化查询时间。
以下是完整的代码,您可以直接运行并测试:
def main():
# 读取输入
n = int(input())
arr = list(map(int, input().split()))
q = int(input())
for _ in range(q):
l, r = map(int, input().split())
l -= 1 # 转换为0开始的索引
r -= 1
max_value = arr[l]
max_indices = [l + 1] # 初始化下标列表(1开始)
for i in range(l + 1, r + 1):
if arr[i] > max_value:
max_value = arr[i]
max_indices = [i + 1]
elif arr[i] == max_value:
max_indices.append(i + 1)
# 输出结果
print(max_value)
print(' '.join(map(str, max_indices)))
if __name__ == "__main__":
main()