結果
| 問題 |
No.1921 Range LthKth Query
|
| ユーザー |
👑 tatyam
|
| 提出日時 | 2022-05-01 23:26:31 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 250 ms / 4,000 ms |
| コード長 | 2,248 bytes |
| コンパイル時間 | 3,341 ms |
| コンパイル使用メモリ | 270,072 KB |
| 実行使用メモリ | 81,408 KB |
| 最終ジャッジ日時 | 2024-07-01 01:17:18 |
| 合計ジャッジ時間 | 10,332 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
void chmax(int& a, int b){ if(a < b) a = b; }
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
int N, K, L;
cin >> N >> K >> L;
vector<int> A(N);
for(int& a : A) cin >> a;
vector Kth(N, vector<int>(N));
vector idx = {-1, N};
{
vector<int> I(N);
iota(I.begin(), I.end(), 0);
sort(I.begin(), I.end(), [&](int i, int j){ return A[i] < A[j]; });
for(int id : I){
const int x = A[id];
const int i = upper_bound(idx.begin(), idx.end(), id) - idx.begin();
idx.insert(idx.begin() + i, id);
int r = r = max(K + 1, i + 1), l = l = r - (K + 1);
for(; r < idx.size() && l < i; l++, r++){
for(int j = idx[l + 1]; j > idx[l]; j--){
for(int k = idx[r - 1]; k < idx[r]; k++) Kth[j][k] = x;
}
}
}
}
vector B(N, vector<bool>(N));
vector seg_K(N + 1, vector<pair<int, int>>{});
for(int i = 0; i < N; i++) for(int j = i + K - 1; j < N; j++) seg_K[Kth[i][j]].emplace_back(i, j);
vector<int> row_sum(N), row_r(N, N), col_sum(N), col_l(N);
vector Lth(N, vector<int>(N, 1));
for(int t = 1; t <= N; t++){
for(auto [i, j] : seg_K[t]){
B[i][j] = 1;
if(j < row_r[i]) row_sum[i]++;
if(i >= col_l[j]) col_sum[j]++;
}
for(int i = 0, cnt = 0, j = 0; j < N; j++){
if(col_l[j] < i){
for(int i2 = col_l[j]; i2 < i; i2++) if(B[i2][j]) col_sum[j]--;
col_l[j] = i;
}
cnt += col_sum[j];
while(cnt >= L){
row_sum[i] -= accumulate(B[i].begin() + j + 1, B[i].begin() + row_r[i], 0);
row_r[i] = j + 1;
cnt -= row_sum[i];
i++;
}
if(i < N) Lth[i][j] = t + 1;
}
}
for(int i = 0; i < N; i++) for(int j = N; j--; ){
if(i + 1 < N) chmax(Lth[i + 1][j], Lth[i][j]);
if(j) chmax(Lth[i][j - 1], Lth[i][j]);
}
int Q;
cin >> Q;
while(Q--){
int l, r;
cin >> l >> r;
cout << Lth[l - 1][r - 1] << '\n';
}
}
tatyam