Submission #1092097

#TimeUsernameProblemLanguageResultExecution timeMemory
1092097vjudge1Uplifting Excursion (BOI22_vault)C++14
100 / 100
1279 ms4700 KiB
// BalticOI 2022 Day1 Uplifting Excursion
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  LL M, L;
  cin >> M >> L;
  vector<LL> A(2 * M + 1), C(2 * M + 1);
  for (LL i = 0; i <= 2 * M; i++) cin >> A[i];
  LL sum = 0;  // -M ... 0, 先把负的都算上
  for (LL i = 0; i <= M; i++) sum += A[i] * (i - M), C[i] = A[i];
  for (LL i = M + 1; i <= 2 * M; i++) {  // 再不超过L的前提下贪心选择正的
    C[i] = min((L - sum) / (i - M), A[i]), sum += C[i] * (i - M);
    assert(sum <= L);
  }
  for (LL i = 0; i < M; i++) {
    assert(sum <= L);
    LL c = min((L - sum) / (M - i), A[i]);
    sum += c * (M - i), C[i] -= c;
  }
  if (L - sum > M) return puts("impossible"), 0;
  LL cs = 0, wc = 0;
  const LL MIF = -4e18, B = M * M;
  vector<LL> W{0}, V{0};  // 二进制分组
  for (LL i = 0; i <= 2 * M; i++) {
    cs += C[i];  // 已有的数量
    if (i == M) continue;
    LL k = 1, s = min(A[i] - C[i], B), w = i - M;  // 增加物品
    while (k <= s) W.push_back(w * k), V.push_back(k), s -= k, k *= 2;
    if (s > 0) W.push_back(w * s), V.push_back(s);
    k = 1, s = min(C[i], B);  // 消去物品
    while (k <= s) W.push_back(-w * k), V.push_back(-k), s -= k, k *= 2;
    if (s > 0) W.push_back(-w * s), V.push_back(-s);
  }
  vector<vector<LL>> F(2, vector<LL>(2 * B + 4, MIF));
  F[0][B] = 0, wc = W.size() - 1;
  for (LL i = 1; i <= wc; i++) {
    int ci = i % 2, i1 = ci ^ 1;
    for (LL j = 2 * B; j >= 0; j--) {
      F[ci][j] = F[i1][j];
      if (j >= W[i] and j - W[i] <= 2 * B and F[i1][j - W[i]] != MIF)
        F[ci][j] = max(F[ci][j], F[i1][j - W[i]] + V[i]);
    }
  }
  LL f = F[wc % 2][B + L - sum];
  if (f + cs < 0)
    puts("impossible");
  else
    printf("%lld\n", f + cs);
  return 0;
}
// AC 100
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...