Submission #631743

#TimeUsernameProblemLanguageResultExecution timeMemory
631743MahtimursuPrisoner Challenge (IOI22_prison)C++17
0 / 100
17 ms960 KiB
#include "prison.h"

#include <vector>
#include <iostream>

using namespace std;

pair<int, int> split_range(int value, int a, int b) {
    // Remove endpoints
    a++;
    b--;

    int dif = b - a;
    dif /= 2;

    int c = a + dif;
    if (value <= c) return {a, c};
    return {c + 1, b};
}

pair<int, int> find_range(int value, int steps) {
    int a = 1;
    int b = 5000;

    while (steps--) {
        auto p = split_range(value, a, b);
        a = p.first;
        b = p.second;
    }
    return {a, b};
}

int ans(bool low, bool t) {
    if (!low) t = !t;
    //         B    A
    return t ? -2 : -1;
}
 
int handle(int i, int j) {
    // 0 -> 0
    // 1/2 -> 1
    // 3/4 -> 2
    int steps = (i + 1) / 2;
    bool t = steps % 2;
    
    //cout << i << " j: " << j << " steps: " << steps << " turn: " << (t ? "B" : "A") << endl;

    if (j == 0) return t;

    auto r = find_range(j, steps);

    if (r.first >= j) {
        return ans(1, t);
    } else if (r.second <= j) {
        return ans(0, t);
    }

    auto nr = split_range(j, r.first, r.second);

    if (nr.first == r.first + 1) {
        return steps * 2 + 1;
    } else {
        return steps * 2 + 2;
    }
}

vector<vector<int>> devise_strategy(int N) {
    vector<vector<int>> res;

    int mx = 50;

    for (int i = 0; i <= mx; ++i) {
        vector<int> cur;
        for (int j = 0; j <= N; ++j) {
            cur.push_back(min(handle(i, j), mx));
        }
        res.push_back(cur);
    }

    /*for (auto g : res) {
        for (int x : g) cout << x << " ";
        cout << endl;
    }*/

    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...