제출 #1189286

#제출 시각아이디문제언어결과실행 시간메모리
1189286Boycl07죄수들의 도전 (IOI22_prison)C++20
65 / 100
7 ms1260 KiB
#include "prison.h"

#include "bits/stdc++.h"

using namespace std;

#define ll long long
#define rep(i, n) for(int i = 1; i <= (n); ++i)
#define forn(i, l, r) for(int i = (l); (i) <= (r); ++i)
#define ford(i, r, l) for(int i = (r); (i) >= (l); --i)
#define endl "\n"
#define fi first
#define se second
#define pb push_back
#define pll pair<ll, ll>
#define pii pair<int, int>
#define all(a) a.begin(), a.end()
#define sz(a) (int)(a.size())
#define task "note"

template<typename T> bool maximize(T &res, const T &val) {if(res < val) {res = val; return 1;} return 0;}
template<typename T> bool minimize(T &res, const T &val) {if(res < val) return 0; res = val; return 1;}
inline int readInt()       {char c;while(c=getchar(),c!='-'&&(c<'0'||c>'9'));bool sign=(c=='-');if(sign)c=getchar();int n=c-'0';while(c=getchar(),c>='0'&&c<='9')n=10*n+c-'0';return(!sign)?n:-n;}
inline ll readLong()       {char c;while(c=getchar(),c!='-'&&(c<'0'||c>'9'));bool sign=(c=='-');if(sign)c=getchar();ll  n=c-'0';while(c=getchar(),c>='0'&&c<='9')n=10*n+c-'0';return(!sign)?n:-n;}
inline string readString() {char c;while(c=getchar(),c==' '||c=='\n'||c=='\t');string s({c});while(c=getchar(),c!=EOF&&c!=' '&&c!='\n'&&c!='\t')s+=c;return s;}

const ll LINF = 1e3;
const ll K = 1e2 + 3;
const double EPS = 1e-9;
const int MOD = 1e9 + 7;
const int N = 1e5 + 3;
const int M = 15;
const int LIM = 14348907 + 3;
const ll INF = 1e18;
const int LOG = 12;

int n;

int get_state(int val, int bit)
{
    return bit + ((val >> bit & 1) ? LOG : 0);
}

vector<vector<int>> devise_strategy(int N_)
{
    n = N_;
    vector<vector<int>> res(2 * (LOG + 1) - 1, vector<int>(n + 1, 0));
//    cout << 2 * (LOG + 1) + 1 << endl;
//    cout << get_state(4, 3) << endl;
    for(int i = 0; i < sz(res); ++i)
    {
        if(i == 0)
        {
            res[i][0] = 0;
            for(int j = 1; j <= n; ++j)
                res[i][j] = get_state(j, LOG);
        }
        else
        {
            int bit;
            int x = 0;
            if(i >= LOG + 1) bit = i - LOG, x = 1;
            else bit = i, x = 0;

            res[i][0] = (bit & 1) ^ (!(LOG & 1));
            for(int j = 1; j <= n; ++j)
            {
                int y = j >> bit & 1;

                if(x == y)
                {
                    if(bit > 1) res[i][j] = get_state(j, bit - 1);
                    else
                    {
                        if(!res[i][0]) res[i][j] = ((j & 1)) ? -2 : -1;
                        else res[i][j] = ((j & 1)) ? -1 : -2;
                    }
                }
                else
                {
                    if(!res[i][0]) res[i][j] = (x < y) ? -2 : -1;
                    else res[i][j] = (x < y) ? -1 : -2;
                }
            }
        }
    }
//    for(auto u : res)
//    {
//        for(int v : u) cout << v << " "; cout << endl;
//    }
//    cout << res[5][1] << endl;
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...