結果
| 問題 |
No.878 Range High-Element Query
|
| コンテスト | |
| ユーザー |
neterukun
|
| 提出日時 | 2019-09-06 23:25:42 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 593 ms / 2,000 ms |
| コード長 | 1,565 bytes |
| コンパイル時間 | 322 ms |
| コンパイル使用メモリ | 82,112 KB |
| 実行使用メモリ | 119,392 KB |
| 最終ジャッジ日時 | 2024-06-24 21:22:44 |
| 合計ジャッジ時間 | 6,208 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
class SparseTable():
def __init__(self, array, n):
'''テーブルを構築する'''
self.row_size = n.bit_length()
# log_tableを構築する
# log_table = [0, 0, 1, 1, 2, 2, 2, 2, ...]
self.log_table = [0] * (n + 1)
for i in range(2, n + 1):
self.log_table[i] = self.log_table[i//2] + 1
# sparse_tableを構築する
self.sparse_table = [[0] * n for _ in range(self.row_size)]
for i in range(n):
self.sparse_table[0][i] = array[i]
for row in range(1, self.row_size):
for i in range(n - (1 << row) + 1):
self.sparse_table[row][i] = self._merge(self.sparse_table[row - 1][i], \
self.sparse_table[row - 1][i + (1 << row - 1)])
def _merge(self, num1, num2):
'''クエリの内容'''
return max(num1, num2)
def query(self, l, r):
'''区間[l, r)に対するクエリに答える'''
if r == l:
return None
row = self.log_table[r - l]
return self._merge(self.sparse_table[row][l], self.sparse_table[row][r - (1 << row)])
n, q = map(int, input().split())
a = list(map(int, input().split()))
sp = SparseTable(a, n)
ind_memo = {}
for i in range(n):
ind_memo[a[i]] = i
for _ in range(q):
_, l, r = map(int, input().split())
ans = 0
while True:
if l-1 == r:
break
max_ind = ind_memo[sp.query(l - 1, r)]
ans += 1
r = max_ind
print(ans)
neterukun