結果
| 問題 |
No.878 Range High-Element Query
|
| コンテスト | |
| ユーザー |
neterukun
|
| 提出日時 | 2019-09-06 23:16:38 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 589 ms / 2,000 ms |
| コード長 | 1,864 bytes |
| コンパイル時間 | 307 ms |
| コンパイル使用メモリ | 81,968 KB |
| 実行使用メモリ | 120,320 KB |
| 最終ジャッジ日時 | 2024-06-24 21:13:15 |
| 合計ジャッジ時間 | 6,036 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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
ruiseki = [0]*(n+1)
for i in range(n):
if i == 0:
ruiseki[i+1] = 1
elif a[i-1] < a[i]:
ruiseki[i+1] = ruiseki[i] + 1
else:
ruiseki[i+1] = ruiseki[i]
#print(ruiseki)
for _ in range(q):
_, l, r = map(int, input().split())
ans = 0
while True:
if ruiseki[r] - ruiseki[l-1] == r - l + 1:
ans += r - l + 1
break
if l-1 == r:
break
max_ind = ind_memo[sp.query(l - 1, r)]
ans += 1
r = max_ind
print(ans)
neterukun