제출 #361548

#제출 시각아이디문제언어결과실행 시간메모리
361548KoDThe Big Prize (IOI17_prize)C++17
컴파일 에러
0 ms0 KiB
#include "prize.h"
#include <vector>
#include <utility>
#include <algorithm>
#include <queue>
#include <set>

template <class T>
using Vec = std::vector<T>;

int find_best(int N) {
  int max = 0;
  const auto L = std::min(N, 475);
  Vec<Vec<int>> memo(N);
  const auto query = [&](const int i) -> const Vec<int>& {
    if (memo[i].empty()) {
      memo[i] = ask(i);
    }
    return memo[i];
  };
  for (int i = 0; i < L; ++i) {
    max = std::max(max, query(i)[0] + query(i)[1]);
  }
  std::set<int> pos;
  for (int i = 0; i < L; ++i) {
    if (query(i)[0] + query(i)[1] < max) {
      pos.insert(i);
    }
  }
  std::queue<std::pair<int, int>> que;
  que.emplace(L, N - 1);
  Vec<int> left_count(N + 1, -1);
  left_count[N] = max;
  left_count[L - 1] = left_size;
  const auto left_size = (int) pos.size();
  const auto count = [&](const int l, const int r) {
    return (left_count[r + 1] == -1 ? query(r + 1)[0] : left_count[r + 1]) - (left_count[l - 1] == -1 ? query(l - 1)[0] ? left_count[l - 1]);
  };
  while (!que.empty() && (int) pos.size() < max) {
    const auto [l, r] = que.front();
    que.pop();
    if (l > r) {
      continue;
    }
    if (count(l, r) == 0) {
      continue;
    }
    const auto mid = (l + r) / 2;
    auto nr = mid - 1;
    auto nl = mid;
    while (nl <= r) {
      if (query(nl)[0] + query(nl)[1] == max) {
        break;
      }
      else {
        pos.insert(nl);
        nl += 1;
      }
    }
    if (nl == r + 1) {
      while (nr >= l) {
        if (query(nr)[0] + query(nr)[1] == max) {
          break;
        }
        else {
          pos.insert(nr);
          nr -= 1;
        }
      }
      que.emplace(l, nr - 1);
    }
    else {
      left_count[mid] = query(nl)[0];
      que.emplace(l, mid - 1);
      que.emplace(nl + 1, r);
    }
  } 
  for (const auto x: pos) {
    if (query(x)[0] + query(x)[1] == 0) {
      return x;
    }
  }
  return -1;
}

컴파일 시 표준 에러 (stderr) 메시지

prize.cpp: In function 'int find_best(int)':
prize.cpp:34:23: error: 'left_size' was not declared in this scope
   34 |   left_count[L - 1] = left_size;
      |                       ^~~~~~~~~
prize.cpp: In lambda function:
prize.cpp:37:140: error: expected ':' before ')' token
   37 |     return (left_count[r + 1] == -1 ? query(r + 1)[0] : left_count[r + 1]) - (left_count[l - 1] == -1 ? query(l - 1)[0] ? left_count[l - 1]);
      |                                                                                                                                            ^
      |                                                                                                                                            :
prize.cpp:37:140: error: expected primary-expression before ')' token
prize.cpp:37:140: error: expected ':' before ')' token
   37 |     return (left_count[r + 1] == -1 ? query(r + 1)[0] : left_count[r + 1]) - (left_count[l - 1] == -1 ? query(l - 1)[0] ? left_count[l - 1]);
      |                                                                                                                                            ^
      |                                                                                                                                            :
prize.cpp:37:140: error: expected primary-expression before ')' token
prize.cpp: In function 'int find_best(int)':
prize.cpp:45:21: error: invalid operands of types 'void' and 'int' to binary 'operator=='
   45 |     if (count(l, r) == 0) {
      |         ~~~~~~~~~~~ ^~ ~
      |              |         |
      |              void      int