結果

問題 No.3188 K-th Lexmin
ユーザー 蜜蜂
提出日時 2025-06-13 02:10:46
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,455 bytes
コンパイル時間 2,420 ms
コンパイル使用メモリ 129,776 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2025-06-13 16:34:35
合計ジャッジ時間 7,519 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 1
other WA * 47
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
using namespace std;

#include <atcoder/string>
using namespace atcoder;

int main(){
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  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 << endl;
}
0