結果
| 問題 |
No.1921 Range LthKth Query
|
| ユーザー |
👑 tatyam
|
| 提出日時 | 2022-05-01 20:43:24 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,705 ms / 4,000 ms |
| コード長 | 1,792 bytes |
| コンパイル時間 | 165 ms |
| コンパイル使用メモリ | 82,136 KB |
| 実行使用メモリ | 370,952 KB |
| 最終ジャッジ日時 | 2024-07-01 01:19:52 |
| 合計ジャッジ時間 | 22,112 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 MLE * 3 |
ソースコード
import sys
import bisect
input = sys.stdin.readline
N, K, L = map(int, input().split())
A = list(map(int, input().split()))
# Kth[i][j] = Kth(A[i:j+1])
Kth = [[0] * N for i in range(N)]
idx = [-1, N]
for id in sorted(range(N), key=lambda id: A[id]):
x = A[id]
i = bisect.bisect(idx, id)
idx.insert(i, id)
r = max(K + 1, i + 1)
l = r - (K + 1)
while r < len(idx) and l < i:
for j in range(idx[l + 1], idx[l], -1):
for k in range(idx[r - 1], idx[r]):
Kth[j][k] = x
l += 1
r += 1
# B[i][j] = Kth[i][j] <= t
B = [[0] * N for i in range(N)]
# Kth[i][j] = t forall i, j in seg_K[t]
seg_K = [[] for i in range(N + 1)]
for i in range(N):
for j in range(i + K - 1, N):
seg_K[Kth[i][j]].append((i, j))
row_sum = [0] * N
row_r = [N] * N
col_sum = [0] * N
col_l = [0] * N
Lth = [[1] * N for i in range(N)]
for t in range(1, N + 1):
for i, j in seg_K[t]:
B[i][j] = 1
if j < row_r[i]:
row_sum[i] += 1
if i >= col_l[j]:
col_sum[j] += 1
i = 0
cnt = 0
for j in range(N):
if col_l[j] < i:
col_sum[j] -= sum(B[i2][j] for i2 in range(col_l[j], i))
col_l[j] = i
cnt += col_sum[j]
while cnt >= L:
row_sum[i] -= sum(B[i][j + 1 : row_r[i]])
row_r[i] = j + 1
cnt -= row_sum[i]
i += 1
if i < N:
Lth[i][j] = t + 1
for i in range(N):
for j in range(N - 1, -1, -1):
if i + 1 < N and Lth[i + 1][j] < Lth[i][j]:
Lth[i + 1][j] = Lth[i][j]
if j and Lth[i][j - 1] < Lth[i][j]:
Lth[i][j - 1] = Lth[i][j]
Q = int(input())
for i in range(Q):
l, r = map(int, input().split())
print(Lth[l - 1][r - 1])
tatyam