Submission #1362835

#TimeUsernameProblemLanguageResultExecution timeMemory
1362835ereringPrisoner Challenge (IOI22_prison)C++20
54.50 / 100
9 ms1348 KiB
#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> devise_strategy(int N) {
    vector<int> p3(1, 1);
    while (p3.back() < N) p3.push_back(p3.back() * 3);

    int L = (int)p3.size();
    int states = 1 + 3 * L;
    vector<vector<int>> s(states, vector<int>(N + 1, 0));

    auto digit = [&](int value, int level) {
        int v = value - 1;
        int div = p3[L - 1 - level];
        return (v / div) % 3;
    };

    auto id = [&](int level, int d) {
        return 1 + 3 * level + d;
    };

    s[0][0] = 0;
    for (int j = 1; j <= N; j++) {
        s[0][j] = id(0, digit(j, 0));
    }

    for (int level = 0; level < L; level++) {
        for (int d = 0; d < 3; d++) {
            int cur = id(level, d);
            int inspect = (level % 2 == 0 ? 1 : 0);
            s[cur][0] = inspect;

            for (int j = 1; j <= N; j++) {
                int got = digit(j, level);

                if (got == d) {
                    if (level + 1 < L) {
                        s[cur][j] = id(level + 1, digit(j, level + 1));
                    } else {
                        s[cur][j] = 0;
                    }
                } else if (inspect == 1) {
                    if (d < got) s[cur][j] = -1;
                    else s[cur][j] = -2;
                } else {
                    if (got < d) s[cur][j] = -1;
                    else s[cur][j] = -2;
                }
            }
        }
    }

    return s;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...