結果
| 問題 |
No.1460 Max of Min
|
| ユーザー |
|
| 提出日時 | 2021-04-25 15:43:04 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,504 bytes |
| コンパイル時間 | 2,222 ms |
| コンパイル使用メモリ | 199,252 KB |
| 最終ジャッジ日時 | 2025-01-21 00:55:59 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 72 WA * 19 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
void chmax(int64_t& a, int64_t b){ a = max(a, b); }
void chmin(int64_t& a, int64_t b){ a = min(a, b); }
int main(){
int K, N;
cin >> K >> N;
vector<int64_t> A(2*K), B(K);
for(int i=0; i<K; i++) cin >> A[i];
for(int i=0; i<K; i++) cin >> B[i];
const int64_t INF = 1e18;
// 最初にA[2K-1]まで求めてしまう
for(int i=K; i<2*K; i++){
int64_t mx = -INF;
for(int j=0; j<K; j++) chmax(mx, min(A[i-K+j], B[j]));
A[i] = mx;
}
if(N < 2*K){
cout << A[N] << endl;
return 0;
}
// A[N] >= x かどうかを返す
auto check = [&](int64_t x)->bool{
vector<int> S, T;
for(int i=K; i<2*K; i++) if(A[i] >= x) S.push_back(i);
for(int i=0; i<K; i++) if(B[i] >= x) T.push_back(K-i);
if(T.size() == 0) return false;
// ダイクストラ法
int m = T[0];
vector<int64_t> D(m, INF+1);
for(int s : S) chmin(D[s%m], s);
vector<bool> done(m);
while(true){
int s = -1;
for(int i=0; i<m; i++) if(!done[i]) if(s == -1 || D[s] > D[i]) s = i;
if(s == -1) break;
for(int t : T) chmin(D[(s+t)%m], D[s] + t);
done[s] = true;
}
return (D[N%m] <= N);
};
int64_t ok = -INF, ng = INF+1;
while(ng-ok>1){
int64_t mid = (ok+ng)/2;
(check(mid) ? ok : ng) = mid;
}
cout << ok << endl;
return 0;
}