Submission #1184724

#TimeUsernameProblemLanguageResultExecution timeMemory
1184724versesrev은행 (IZhO14_bank)C++20
Compilation error
0 ms0 KiB
#include <iostream>
#include <array>
#include <map>
#include <algorithm>
#include <numeric>

int main() {
  int n, m;
  std::cin >> n >> m;
  std::vector<int> as(n), bs(m);
  for (int& a : as) std::cin >> a;
  for (int& b : bs) std::cin >> b;
  
  std::ranges::sort(as), std::ranges::sort(bs);
  
  std::map<std::array<int, 21>, bool> table;
  auto brute = [&](auto&& self, const std::array<int, 21>& state, int a_sum, int b_sum) -> bool {
    if (table.contains(state)) return table[state];
    if (b_sum < a_sum) {
      return table[state] = false;
    }
    if (state[0] == m) {
      return table[state] = (a_sum == 0);
    }
    std::array<int, 21> new_state = state;
    int b = bs[new_state[0]]; ++new_state[0]
    if (self(self, new_state, a_sum, b_sum - b)) {
      return table[state] = true;
    }
    for (int i = 1; i < 21; ++i) {
      if (b < new_state[i]) continue;
      new_state[i] -= b;
      int j = i;
      for (; j > 1 and new_state[j-1] > new_state[j]; --j) {
        std::swap(new_state[j-1], new_state[j]);
      }
      if (self(self, new_state, a_sum - b, b_sum - b)) { return table[state] = true; }
      for (; j != i; ++j) {
        if (j != 1) std::swap(new_state[j-1], new_state[j]);
      }
      new_state[i] += b;
    }
    return table[state] = false;
  };
  
  std::array<int, 21> state;
  for (int i = 0; i < n; ++i) state[i] = as[i];
  std::ranges::sort(state);
  int a_sum = std::accumulate(as.begin(), as.end(), 0);
  int b_sum = std::accumulate(bs.begin(), bs.end(), 0);
  bool ans = brute(brute, state);
  std::cout << "YES\n";
}

Compilation message (stderr)

bank.cpp: In lambda function:
bank.cpp:26:45: error: expected ';' before 'if'
   26 |     int b = bs[new_state[0]]; ++new_state[0]
      |                                             ^
      |                                             ;
   27 |     if (self(self, new_state, a_sum, b_sum - b)) {
      |     ~~                                       
bank.cpp: In function 'int main()':
bank.cpp:51:19: error: no match for call to '(main()::<lambda(auto:16&&, const std::array<int, 21>&, int, int)>) (main()::<lambda(auto:16&&, const std::array<int, 21>&, int, int)>&, std::array<int, 21>&)'
   51 |   bool ans = brute(brute, state);
      |              ~~~~~^~~~~~~~~~~~~~
bank.cpp:17:16: note: candidate: 'template<class auto:16> main()::<lambda(auto:16&&, const std::array<int, 21>&, int, int)>'
   17 |   auto brute = [&](auto&& self, const std::array<int, 21>& state, int a_sum, int b_sum) -> bool {
      |                ^
bank.cpp:17:16: note:   template argument deduction/substitution failed:
bank.cpp:51:19: note:   candidate expects 4 arguments, 2 provided
   51 |   bool ans = brute(brute, state);
      |              ~~~~~^~~~~~~~~~~~~~