結果
問題 |
No.3188 K-th Lexmin
|
ユーザー |
![]() |
提出日時 | 2025-06-13 02:36:36 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 462 ms / 3,500 ms |
コード長 | 1,522 bytes |
コンパイル時間 | 1,929 ms |
コンパイル使用メモリ | 129,708 KB |
実行使用メモリ | 10,932 KB |
最終ジャッジ日時 | 2025-06-13 16:34:46 |
合計ジャッジ時間 | 16,254 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 47 |
ソースコード
#include <iostream> #include <vector> using namespace std; #include <atcoder/string> using namespace atcoder; void solve(){ int n; long long k; cin >> n >> k; vector<int> a(n); for(int i = 0; i < n; i++){ cin >> a[i]; a[i]--; } vector<int> sa = suffix_array<int>(a), len(n); vector<long long> lensum(n + 1, 0); for(int i = 0; i < n; i++){ len[i] = n - sa[i]; lensum[i + 1] = lensum[i] + len[i]; } int l = 0, r = n - 1; long long rem = k; vector<int> ans; for(int i = 0; i < n; i++){ auto range = [&](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 right = range(val); long long res = lensum[right + 1] - lensum[l] - (long long)(right - l + 1) * i; return res; }; int ok = -1, ng = n + 1; long long c; while(ng - ok > 1){ int check = (ok + ng) / 2; long long cnt = num(check); if(cnt < rem) c = cnt, ok = check; else ng = check; } ans.emplace_back(ng + 1); rem -= num(ok); int left = range(ok) + 1, right = range(ng); l = left, r = right; rem -= r - l + 1; if(rem <= 0) break; } for(int val: ans) cout << val << " "; cout << "\n"; } int main(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t; cin >> t; while(t--){ solve(); } }