제출 #678472

#제출 시각아이디문제언어결과실행 시간메모리
678472cig32죄수들의 도전 (IOI22_prison)C++17
80 / 100
12 ms980 KiB
#include "prison.h"
#include "bits/stdc++.h"
using namespace std;
 
#include <vector>
 
std::vector<std::vector<int>> devise_strategy(int N);
 
 
 
int bit(int n, int b) {
  int p = 1;
  for(int i=0; i<b; i++) p *= 3;
  n %= (3 * p);
  return n / p;
}
std::vector<std::vector<int>> devise_strategy(int N) {
 
  int x = 22;
  vector<vector<int> > ans;
  // each array inside should hv length = N + 1
  ans.resize(x + 1);
  for(int i=0; i<=x; i++) ans[i].resize(N + 1);
  
  ans[0][0] = 0;
  for(int i=1; i<=N; i++) ans[0][i] = bit(i, 7) + 1;
 
  for(int i=7; i>=1; i--) {
    for(int j=(7-i) * 3 + 1; j<=(7-i) * 3 + 3; j++) {
      ans[j][0] = i % 2;
      int cc = j - (7-i) * 3 - 1;
      for(int k=1; k<=N; k++) {
        int bb = bit(k, i);
        if(bb > cc) ans[j][k] = (i % 2 ? -1 : -2);
        else if(bb < cc) ans[j][k] = (i % 2 ? -2 : -1);
        else {
          ans[j][k] = min(x, (8-i) * 3 + bit(k, i-1) + 1);
          if(i == 1 && bit(k, 0) == 2) ans[j][k] = -1;
          else if(i == 1 && bit(k, 0) == 0) ans[j][k] = -2;
        }
      }
    }
  }
 
  // Hardcode 22
  ans[22][0] = 0;
  for(int i=1; i<=N; i++) {
    int bb = bit(i, 0);
    if(bb > 1) ans[22][i] = -2;
    else ans[22][i] = -1;
  }
 
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...