結果
| 問題 |
No.3188 K-th Lexmin
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-23 12:46:07 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 574 ms / 3,500 ms |
| コード長 | 1,285 bytes |
| コンパイル時間 | 4,660 ms |
| コンパイル使用メモリ | 303,908 KB |
| 実行使用メモリ | 10,908 KB |
| 最終ジャッジ日時 | 2025-08-23 12:46:34 |
| 合計ジャッジ時間 | 26,712 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 47 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i = 0; i< (n); ++i)
#define all(x) (x).begin(), (x).end()
#define fore(i,a) for(auto &i:a)
using ll = long long;
#include<atcoder/string>
using namespace atcoder;
void solve(){
int n;
ll k;
cin >> n >> k;
vector<int > a(n);
rep(i, n){
cin >> a[i];
}
vector<int> sa = suffix_array<int>(a), len(n);
vector<ll> lensum(n+1, 0);
rep(i, n){
len[i] = n-sa[i];
lensum[i+1] = lensum[i]+len[i];
}
int l = 0, r = n-1;
ll rem = k;
vector<int> ans;
rep(i, n){
auto ran = [&](int val){
int ok = l-1, ng = r+1;
while(ng-ok > 1){
int check = (ok+ng)/2;
if(sa[check]+i >= n || a[sa[check]+i] <= val)ok =check;
else ng = check;
}
return ok;
};
auto num = [&](int val){
int nr = ran(val);
ll res = lensum[nr+1]-lensum[l]-ll(nr-l+1)*i;
return res;
};
int ok = -1, ng = n+1;
ll c;
while(ng-ok>1){
int check = (ok+ng)/2;
ll cnt = num(check);
if(cnt < rem) c = cnt, ok = check;
else ng = check;
}
ans.emplace_back(ng);
rem -= num(ok);
int nl = ran(ok)+1;int nr = ran(ng);
l = nl, r = nr;
rem -= r-l+1;
if(rem <= 0) break;
}
fore(val, ans)cout << val << " ";
cout << endl;
}
int main() {
int t;
cin >> t;
while(t--){
solve();
}
}