Submission #764313

#TimeUsernameProblemLanguageResultExecution timeMemory
764313boris_mihovParrots (IOI11_parrots)C++17
98 / 100
8 ms1372 KiB
#include "encoder.h"
#include "encoderlib.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
#include <random>
#include <map>

const int MAXN = 64 + 6;
const int MAXNUM = 256 + 6;

struct State2
{
    int state[5];
    State2()
    {
        std::fill(state, state + 5, 0);
    }
};

int cnt2 = 0;
int perm2[MAXNUM];
State2 convert[MAXNUM];
std::mt19937 mt2(6942012);
void brute(int left, int pos, State2 state)
{
    if (pos == 4)
    {
        if (cnt2 >= 256)
        {
            return;
        }
        
        state.state[pos] = left;
        convert[perm2[cnt2++]] = state;
        return;
    }

    brute(left, pos + 1, state);
    if (left >= 1)
    {
        state.state[pos]++;
        brute(left - 1, pos, state);
    }
}

bool was2 = false;
void encode(int N, int M[])
{
    if (!was2)
    {
        std::iota(perm2, perm2 + 256, 0);
        std::shuffle(perm2, perm2 + 256, mt2);
        State2 state;
        brute(7, 0, state);
        was2 = true;
    }

    for (int i = 0 ; i < N ; ++i)
    {
        for (int j = 0 ; j < 4 ; ++j)
        {
            for (int k = 0 ; k < convert[M[i]].state[j] ; ++k)
            {
                send(N * j + i);
            }
        }
    }
}
#include "decoder.h"
#include "decoderlib.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
#include <random>
#include <map>

const int MAXN = 64 + 6;
const int MAXNUM = 256 + 6;

struct State
{
    int state[5];
    State()
    {
        std::fill(state, state + 5, 0);
    }

    friend bool operator < (const State &a, const State &b)
    {
        for (int i = 0 ; i < 5 ; ++i)
        {
            if (a.state[i] < b.state[i]) return true;
            if (a.state[i] > b.state[i]) return false;
        }

        return false;
    }
};

int cnt;
int perm[MAXNUM];
bool was = false;
std::mt19937 mt(6942012);
std::map <State,int> mp;
void brute(int left, int pos, State state)
{
    if (pos == 4)
    {
        if (cnt >= 256)
        {
            return;
        }

        state.state[pos] = left;
        mp[state] = perm[cnt++];
        return;
    }

    brute(left, pos + 1, state);
    if (left >= 1)
    {
        state.state[pos]++;
        brute(left - 1, pos, state);
    }
}

int ans[MAXN];
int lastBit[MAXN];

State a[MAXN];
void decode(int N, int L, int X[])
{
    if (!was)
    {
        cnt = 0;
        mp.clear();
        State state;
        std::iota(perm, perm + 256, 0);
        std::shuffle(perm, perm + 256, mt);
        brute(7, 0, state);
        was = true;
    }

    for (int i = 0 ; i < N ; ++i)
    {
        ans[i] = 0;
        for (int j = 0 ; j < 4 ; ++j)
        {
            a[i].state[j] = 0;
        }

        a[i].state[4] = 7;
    }

    for (int i = 0 ; i < L ; ++i)
    {
        a[X[i] % N].state[4]--;
        a[X[i] % N].state[X[i] / N]++;
    }

    for (int i = 0 ; i < N ; ++i)
    {
        output(mp[a[i]]);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...