# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
626810 | typ_ik | 죄수들의 도전 (IOI22_prison) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "prison.h"
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define boost ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define watch(x) cout << (#x) << " : " << x << '\n'
#define int long long
using namespace std;
const int N = 5e3 + 1;
vector <int> notation[N];
bool inited;
vector <int> step3(int x) {
vector <int> cur;
for (int i = 0; i < 8; i++)
cur.push_back(x % 3), x /= 3;
return vector<int>(cur.rbegin(), cur.rend());
}
void init() {
if (inited)
return;
inited = true;
for (int i = 0; i < N; i++)
notation[i] = step3(i);
}
vector<vector<int>> devise_strategy(int N) {
init();
vector < vector<int> > ans;
ans.push_back({0});
for (int i = 0; i < N; i++)
ans.back().push_back(1+notation[i][0]);
for (int p = 0; p < 8; p++) {
for (int x = 0; x < 3; x++) {
int isB = p & 1 ^ 1, isA = p & 1;
ans.push_back({isB});
for (int i = 0; i < N; i++)
if (notation[i][p] != x) {
if (notation[i][p] > x) ans.back().push_back(-1 + -isA);
else ans.back().push_back(-1 + -isB);
} else if (p + 1 < 8) {
ans.back().push_back(1+notation[i][p + 1] + 3 * (p + 1));
} else {
ans.back().push_back(-1 + -isB);
}
}
}
return ans;
}