結果
問題 | No.2890 Chiffon |
ユーザー |
![]() |
提出日時 | 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;}