1273. 天才的记忆

摘要
Title: 1273. 天才的记忆
Tag: RMQ、st表
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

1273. 天才的记忆

  • 题意

    多次离线求区间最大值

  • 思路

    状态表示:f[i,j]f[i,j]表示从ii开始长度是2j2^j的区间中的最大值
    1273
    另ST表的题解 link

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    '''
    Author: NEFU AB-IN
    Date: 2022-04-12 19:44:06
    FilePath: \ACM\Acwing\1273.py
    LastEditTime: 2022-04-12 19:44:06
    '''
    N = int(2e5 + 10)
    M = 18
    fmax = [[0] * M for _ in range(N)]
    log = [0] * N


    def init():
    for j in range(M):
    i = 1 # 下标一定从1开始
    while i + (1 << j) - 1 <= n: #右端点不超过n
    if j == 0: fmax[i][j] = a[i]
    else:
    fmax[i][j] = max(fmax[i][j - 1], fmax[i + (1 << j - 1)][j - 1])
    i += 1

    log[1] = 0
    for i in range(2, N):
    log[i] = log[i >> 1] + 1


    def query(l, r):
    k = log[r - l + 1]
    return max(fmax[l][k], fmax[r - (1 << k) + 1][k])


    n = int(input())
    a = list(map(int, input().split()))
    a = [0, *a]

    init()

    m = int(input())
    for i in range(m):
    l, r = map(int, input().split())
    print(query(l, r))
使用搜索:谷歌必应百度