結果
| 問題 |
No.3188 K-th Lexmin
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-23 13:23:20 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 583 ms / 3,500 ms |
| コード長 | 1,271 bytes |
| コンパイル時間 | 4,243 ms |
| コンパイル使用メモリ | 305,464 KB |
| 実行使用メモリ | 10,912 KB |
| 最終ジャッジ日時 | 2025-08-23 13:23:44 |
| 合計ジャッジ時間 | 24,150 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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(a), len(n);
vector<ll> lensum(n+1, 0);
ll rem = k;
rep(i, n){
len[i] = n-sa[i];
lensum[i+1] = lensum[i]+len[i];
}
int l = 0,r = n-1;
vector<int> ans;
auto ran = [&](int val, int ind){
int ok = l-1, ng = r+1;
while(ng-ok > 1){
int check = (ok+ng)/2;
if(sa[check]+ind >= n || a[sa[check]+ind] <= val)ok = check;
else ng = check;
}
return ok;
};
auto num = [&](int val, int ind){
int nr = ran(val, ind);
ll res = lensum[nr+1]-lensum[l]-ll(nr-l+1)*ind;
return res;
};
rep(i, n){
int ok = 0,ng = n+1;
while(ng-ok>1){
int check = (ok+ng)/2;
if(num(check, i) < rem) ok = check;
else ng = check;
}
int nl = ran(ok,i)+1; int nr = ran(ng,i);
ans.push_back(ng);
rem -= num(ok, i);
rem -= nr-nl+1;
l = nl;r = nr;
if(rem <= 0)break;
}
fore(val, ans){
cout << val << " ";
}
cout << "\n";
}
int main() {
int t;
cin >> t;
while(t--){
solve();
}
}