"""
https://www.lanqiao.cn/problems/1205/learning/?page=1&first_category_id=1&problem_id=1205
"""
import math
# 创建ST表
def st_init(a):
n = len(a)
L = math.ceil(math.log(n, 2)) + 1
# f[i][j]: 表示从i开始(包括i)区间长度为2 ^ j内的最值
# 也就是区间[i, i + 2 ^ j - 1]内的最值
f = [[0] * L for _ in range(n)]
# 初始化长度为2 ^ 0的区间最值
for i in range(n):
f[i][0] = a[i]
# 枚举区间长度2 ^ j
for j in range(1, L):
pj = 1 << (j - 1) # 2 ^ (j - 1)
for i in range(n - pj):
# i的区间在[0, n - pj)的目的是确保i + pj不会越界
f[i][j] = max(f[i][j - 1], f[i + pj][j - 1])
print([i, j])
return f
def query(f, l, r):
s = int(math.log(r - l + 1, 2))
# 区间[l, l + 2 ^ s - 1]和[r - 2 ^ s + 1, r]可以完全覆盖[l, s]
return max(f[l][s], f[r - (1 << s) + 1][s])
# 数组长度和询问次数
n, q = map(int, input().split())
a = list(map(int, input().split()))
f = st_init(a)
for _ in range(q):
l, r = map(int, input().split())
l, r = l - 1, r - 1
print(query(f, l, r))
蓝桥杯-区间最大值
最新推荐文章于 2024-08-16 18:55:06 发布