Submission #1362824

#TimeUsernameProblemLanguageResultExecution timeMemory
1362824ereringPrisoner Challenge (IOI22_prison)C++20
65 / 100
5 ms1152 KiB
#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> devise_strategy(int N) {
    auto factors_for_sum = [](int sum) {
        vector<int> r;
        if (sum == 2) return vector<int>{2};
        if (sum == 3) return vector<int>{3};

        int q = sum / 3;
        int rem = sum % 3;
        if (rem == 0) {
            r.assign(q, 3);
        } else if (rem == 1) {
            r.assign(q - 1, 3);
            r.push_back(4);
        } else {
            r.assign(q, 3);
            r.push_back(2);
        }
        return r;
    };

    vector<int> base;
    for (int sum = 2;; ++sum) {
        vector<int> cand = factors_for_sum(sum);
        long long prod = 1;
        for (int v : cand) prod *= v;
        if (prod >= N) {
            base = cand;
            break;
        }
    }

    int L = (int)base.size();
    vector<int> place(L, 1), offset(L);
    for (int i = L - 2; i >= 0; --i) {
        place[i] = place[i + 1] * base[i + 1];
    }

    int x = 0;
    for (int i = 0; i < L; ++i) {
        offset[i] = x + 1;
        x += base[i];
    }

    auto digit = [&](int value, int pos) {
        int z = value - 1;
        return (z / place[pos]) % base[pos];
    };

    auto id = [&](int pos, int d) {
        return offset[pos] + d;
    };

    vector<vector<int>> s(x + 1, vector<int>(N + 1, 0));

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

    for (int pos = 0; pos < L; ++pos) {
        for (int d = 0; d < base[pos]; ++d) {
            int st = id(pos, d);
            bool inspectB = (pos % 2 == 0);
            s[st][0] = inspectB ? 1 : 0;

            for (int j = 1; j <= N; ++j) {
                int cur = digit(j, pos);

                if (cur < d) {
                    s[st][j] = inspectB ? -2 : -1;
                } else if (cur > d) {
                    s[st][j] = inspectB ? -1 : -2;
                } else {
                    if (pos + 1 == L) {
                        s[st][j] = -1;
                    } else {
                        s[st][j] = id(pos + 1, digit(j, pos + 1));
                    }
                }
            }
        }
    }

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