제출 #1140428

#제출 시각아이디문제언어결과실행 시간메모리
1140428efishelPrisoner Challenge (IOI22_prison)C++20
65 / 100
8 ms1216 KiB
#include "prison.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector <ll>;
using ii = pair <ll, ll>;
using vii = vector <ii>;
using vi = vector <int>;
using vvi = vector <vi>;

vvi devise_strategy (int n) {
    vector <array <ll, 8> > base3;
    for (ll i = 0; i <= n; i++) {
        array <ll, 8> uh = { 0, 0, 0, 0, 0, 0, 0, 0 };
        ll k = i;
        for (ll j = 0; j < 8; j++) {
            uh[j] = k%3;
            k /= 3;
        }
        base3.push_back(uh);
        assert(k == 0);
    }
    vvi ans;
    {vi row;
    row.push_back(0);
    for (ll j = 1; j <= n; j++) {
        row.push_back(1 + base3[j][7]*8);
    }
    ans.push_back(row);}
    for (ll i = 1; i <= 8; i++) { // bit-th bit of !openB is 0
        ll bit = 8-i;
        bool openB = i%2;
        vi row;
        row.push_back(openB);
        for (ll j = 1; j <= n; j++) {
            if (base3[j][bit] != 0 || bit-1 < 0) row.push_back(openB ? -1 : -2);
            else row.push_back(i+1 + base3[j][bit-1]*8);
        }
        for (int &j : row) if (j >= 1+8+8+8) j = -2;
        ans.push_back(row);
    }
    for (ll i = 1; i <= 8; i++) { // bit-th bit of !openB is 1
        ll bit = 8-i;
        bool openB = i%2;
        vi row;
        row.push_back(openB);
        for (ll j = 1; j <= n; j++) {
            if (base3[j][bit] != 1 || bit-1 < 0) row.push_back((base3[j][bit] < 1)^openB ? -1 : -2);
            else row.push_back(i+1 + base3[j][bit-1]*8);
        }
        for (int &j : row) if (j >= 1+8+8+8) j = -2;
        ans.push_back(row);
    }
    for (ll i = 1; i <= 8; i++) { // bit-th bit of !openB is 2
        ll bit = 8-i;
        bool openB = i%2;
        vi row;
        row.push_back(openB);
        for (ll j = 1; j <= n; j++) {
            if (base3[j][bit] != 2 || bit-1 < 0) row.push_back(openB ? -2 : -1);
            else row.push_back(i+1 + base3[j][bit-1]*8);
        }
        for (int &j : row) if (j >= 1+8+8+8) j = -2;
        ans.push_back(row);
    }
    return ans;
}

/*
tro pigra por komenti
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...