Submission #728410

#TimeUsernameProblemLanguageResultExecution timeMemory
728410aykhnPrisoner Challenge (IOI22_prison)C++17
0 / 100
1 ms212 KiB
#include <bits/stdc++.h>
#include "prison.h"

/*
    author: aykhn
    4/21/2023
*/

using namespace std;

typedef long long ll;

#define OPT ios_base::sync_with_stdio(0); \
            cin.tie(0); \
            cout.tie(0)
#define pii pair<int,int>
#define pll pair<ll,ll>
#define all(v) v.begin(), v.end()
#define mpr make_pair
#define pb push_back
#define ts to_string
#define fi first
#define se second
#define inf 0x3F3F3F3F
#define infll 0x3F3F3F3F3F3F3F3FLL
#define bpc __builtin_popcount
#define print(v) for(int i = 0; i < v.size(); i++) cout << v[i] << " "; cout<<endl;
/*
    notes:
        divide the bits into consecutive pairs
        00 -> 0 = x
        01 -> 1 = x
        10 -> 2 = x
        11 -> 3 = x

        can be look as ab where a = 2 and b = 1 so when turned on += them

        on whiteboard: x*10 + group number

        max group number = lg(MAX)/2 + 1 = lg(5000)/2 + 1 ~~ 12/2 + 1 = 7

        max X = 36 (max 1st group = 1 so 17, 36)

        25 + 1.5*3 + 10 = 36 points
        -----------------
        new idea: use 3luk say sistemi
        every bit has 3 form 0, 1, 2
        so i can spare 3 integers to note that, such as a%3 = 0 (a+1)%3 = 1 and so on

        x = 21 or 22

        5000
        2 1 0 1 0 1 2 1

*/

vector<vector<int>> devise_strategy(int n)
{
    vector<vector<int>> s(23, vector<int> (n + 1, 0));

    vector<vector<int>> b(n + 1, vector<int> (8, 0));

    for (int i = 1; i <= n; i++)
    {
        int pow = 2187;
        int x = i;
        for (int j = 7; j >= 0; j--)
        {
            b[i][j] = x/pow;
            x -= b[i][j]*pow;
        }
    }

    s[0][0] = 0;
    for (int i = 1; i <= n; i++)
    {
        s[0][i] = (7 - 1) * 3 + b[i][7];
    }

    for (int i = 20; i >= 3; i--)
    {
        int pos = i/3;
        int bit = i%3;

        for (int j = 1; j <= n; j++)
        {
            if (b[j][pos + 1] < bit)
            {
                if (pos%2) s[i][j] = -2;
                else s[i][j] = -1;
            }
            else if (b[j][pos + 1] > bit)
            {
                if (pos%2) s[i][j] = -1;
                else s[i][j] = -2;
            }
            else
            {
                s[i][j] = (pos - 1) * 3 + b[j][pos];
                if (s[i][j] == 0) s[i][j] = -2;
            }
        }
    }

    /*

    positions:
        6 -> B
        5 -> A
        4 -> B
        3 -> A
        2 -> B
        1 -> A
        0 -> B
    */

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