Submission #1229903

#TimeUsernameProblemLanguageResultExecution timeMemory
1229903avighnaUplifting Excursion (BOI22_vault)C++20
20 / 100
2416 ms11848 KiB
#include <bits/stdc++.h>

int main() {
  int m;
  int64_t l;
  std::cin >> m >> l;
  std::vector<std::pair<int64_t, int>> a;
  int64_t high = 0, low = 0;
  for (int64_t i = -m; i <= m; ++i) {
    uint64_t x;
    std::cin >> x;
    if (i > 0) {
      high += x * i;
    } else {
      low += x * i;
    }
    while (x > 0) {
      int w = std::bit_width(x) - 1;
      if (std::has_single_bit(x + 1)) {
        w += 1;
      }
      for (int bt = 0; bt < w; ++bt) {
        a.push_back({i << bt, 1LL << bt});
      }
      x -= (1LL << w) - 1;
    }
  }
  if (l < low or l > high) {
    std::cout << "impossible\n";
    return 0;
  }
  const int inf = 1e9;
  std::vector dp(2, std::vector<int>(high - low + 1, -inf));
  dp[0][-low] = 0;
  for (int i = 1; i <= a.size(); ++i) {
    for (int j = low; j <= high; ++j) {
      dp[i & 1][j - low] = dp[!(i & 1)][j - low];
      if (low <= j - a[i - 1].first and j - a[i - 1].first <= high) {
        dp[i & 1][j - low] = std::max(dp[i & 1][j - low], dp[!(i & 1)][j - a[i - 1].first - low] + a[i - 1].second);
      }
    }
  }
  int ans = dp[a.size() & 1][l - low];
  if (ans < 0) {
    std::cout << "impossible\n";
  } else {
    std::cout << ans << '\n';
  }
}
#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...