제출 #633198

#제출 시각아이디문제언어결과실행 시간메모리
633198JeanBombeur죄수들의 도전 (IOI22_prison)C++17
100 / 100
12 ms1368 KiB
#include "prison.h"
#include <vector>
#include <cstdio>
using namespace std;

//  <|°_°|>

//  M. Broccoli

//  The hardest choices require the strongest wills

//  What is better - to be born good, or to overcome your evil nature with great effort ?

const int SIZE = (20);
const int MAXIMUM = (5001);

int Answer[SIZE + 1][MAXIMUM];

int done = 0;

int IsSmaller(int bag) {
    return bag ? -2 : -1;
}

void Fill(int number, int left, int right) {
    int rest = 0, cut = 3, bag = 0;
    if (number > 5)
        bag = (number / 3) & 1, rest = number % 3;
    else if (number > 1)
        bag = (number >> 2) & 1, rest = number & 1, cut = 2;
    else
        bag = 1, cut = 1;
    
    Answer[number][0] = bag;
    Answer[number][left ++] = IsSmaller(bag);
    Answer[number][-- right] = IsSmaller(!bag);
    
    if (!number)
        left --, right ++;
    
    int mini = left + ((right - left) * rest + cut - 1) / cut;
    int maxi = left + ((right - left) * (rest + 1) + cut - 1) / cut;
    for (int i = left; i <= mini; i ++)
    {
        Answer[number][i] = IsSmaller(bag);
    }
    for (int i = maxi - 1; i < right; i ++)
    {
        Answer[number][i] = IsSmaller(!bag);
    }
    int nv = number ? number - rest : 21;
    if (number == 1)
        return;
    if (!number)
        cut = 3;
    if (number == 2 || number == 3)
        cut = 1;
    if (number / 3 == 2)
        cut = 2;
    nv -= cut;
    mini ++, maxi --;
    for (int i = mini; i < maxi; i ++)
    {
        Answer[number][i] = nv + (i - mini) * cut / (maxi - mini);
    }
    for (int i = 0; i < cut; i ++)
    {
        Fill(nv + i, mini - 1, maxi + 1);
    }
    return;
}

vector <vector <int>> devise_strategy(int maximum) {
    if (!done)
        Fill(0, 1, MAXIMUM), done = 1;
    
    vector <vector <int>> ans(SIZE + 1);
    for (int i = 0; i <= SIZE; i ++)
    {
        ans[i].resize(maximum + 1, 0);
        for (int j = 0; j <= maximum; j ++)
            ans[i][j] = Answer[i][j];
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...