제출 #814025

#제출 시각아이디문제언어결과실행 시간메모리
814025KoD죄수들의 도전 (IOI22_prison)C++17
0 / 100
4 ms580 KiB
#include "prison.h"

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#include <utility>
#include <vector>

using std::cerr;
using std::cin;
using std::cout;
using std::endl;

using std::array;
using std::pair;
using std::string;
using std::tuple;
using std::vector;

using std::begin;
using std::end;

using ll = long long;
constexpr int inf = (1 << 30) - 1;
constexpr ll infll = (1ll << 62) - 1;

vector<vector<int>> devise_strategy(int N) {
  const int D = 8;
  const int M = 22;
  vector pow3(D, 1);
  for (int i = 1; i < D; ++i) {
    pow3[i] = pow3[i - 1] * 3;
  }
  const auto get = [&](int i, int d) {
    return (i / pow3[d]) % 3;
  };
  vector S(M + 1, vector(N + 1, 0));
  {
    S[0][0] = 0;
    for (int i = 1; i <= N; ++i) {
      S[0][i] = (D - 1) * 3 - 1 + get(i, D - 1);
    }
  }
  {
    S[1][0] = 0;
    for (int i = 1; i <= N; ++i) {
      S[1][i] = (i % 3 == 0) ? -1 : -2;
    }
  }
  for (int d = D - 1; d >= 1; --d) {
    const int type = (D - d) & 1;
    for (int r = 0; r <= 2; ++r) {
      const int u = d * 3 - 1 + r;
      S[u][0] = type;
      for (int i = 1; i <= N; ++i) {
        const int k = get(i, d);
        if (r == k) {
          const int k2 = get(i, d - 1);
          if (d == 1) {
            if (k2 == 1) {
              S[u][i] = 1;
            } else {
              S[u][i] = ((k == 1) xor type) ? -1 : -2;
            }
          } else {
            S[u][i] = (d - 1) * 3 - 1 + k2;
          }
        } else {
          S[u][i] = ((r > k) xor type) ? -1 : -2;
        }
      }
    }
  }
  return S;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...