結果
| 問題 |
No.2890 Chiffon
|
| コンテスト | |
| ユーザー |
srjywrdnprkt
|
| 提出日時 | 2024-10-02 15:04:58 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 703 ms / 2,000 ms |
| コード長 | 1,437 bytes |
| コンパイル時間 | 2,329 ms |
| コンパイル使用メモリ | 197,676 KB |
| 最終ジャッジ日時 | 2025-02-24 14:28:53 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 53 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main(){
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
ll N, K;
cin >> N >> K;
vector<ll> A(K*2+1);
for (int i=0; i<K; i++){
cin >> A[i];
A[i+K] = A[i]+N*2;
}
A[K*2] = 1e9;
ll l=0, r=N+1, c;
auto f=[&](ll X){
//dp(i):iで切ったとき次の切れ目
//dp(i)=(2i+1~2i+2X-1にいちごがあるなら2i+2X, ないなら2i+2X以上の最小のA+1)
//dp(i)=max(2i+1以上の最小の(A+1)/2, i+X)
int k=0, L;
vector<int> dp(N*2+2), v(N*2+2);
dp[N*2+1] = N*2+1;
for (int i=1; i<=N*2; i++){
while (k<K*2 && A[k]<i*2+1) k++;
dp[i] = min(N*2+1, max(X+i, (A[k]+1)/2));
}
iota(v.begin(), v.end(), 0);
L = K;
while(L){
vector<int> pd(N*2+2);
if (L & 1){
for (int i=1; i<=N*2+1; i++) v[i] = dp[v[i]];
}
for (int i=1; i<=N*2+1; i++) pd[i] = dp[dp[i]];
swap(pd, dp);
L >>= 1;
}
//for (int i=1; i<=N; i++) cout << v[i] << " ";
//cout << endl;
for (int i=1; i<=N; i++){
if (v[i] <= i+N) return 1;
}
return 0;
};
while(r-l>1){
c = (l+r)/2;
if (f(c)) l=c;
else r=c;
}
cout << l*2 << endl;
return 0;
}
srjywrdnprkt