Submission #701323

#TimeUsernameProblemLanguageResultExecution timeMemory
701323JohannFlight to the Ford (BOI22_communication)C++17
74 / 100
3458 ms2052 KiB
#include "communication.h"
#include <vector>
#include <iostream>
#include <numeric>
#include <cassert>
using namespace std;

//
// --- Sample implementation for the task communication ---
//
// To compile this program with the sample grader, place:
//     communication.h communication_sample.cpp sample_grader.cpp
// in a single folder, then open the terminal in this directory (right-click onto an empty spot in the directory,
// left click on "Open in terminal") and enter e.g.:
//     g++ -std=c++17 communication_sample.cpp sample_grader.cpp
// in this folder. This will create a file a.out in the current directory which you can execute from the terminal
// as ./a.out
// See task statement or sample_grader.cpp for the input specification
//

typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vpii;
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
vi messa = {0b0000, 0b1001, 0b0110, 0b1111};
vi errors = {0, 1, 2, 4, 5, 8, 9, 10};

vpii genIntervalls(int N)
{
    int size = 4;
    while (size < N)
        size *= 2;
    return {make_pair(0, size / 2), make_pair(size / 2, size)};
}
void splitInter(vpii &inter)
{
    assert(sz(inter) == 2);
    vpii ni;
    for (pii i : inter)
    {
        int m = (i.first + i.second) / 2;
        ni.push_back({i.first, m});
        ni.push_back({m, i.second});
    }
    swap(ni, inter);
}
void filterPoss(vpii &inter, pii &areas)
{
    vpii ni = {inter[areas.first], inter[areas.second]};
    swap(ni, inter);
}

pii evalQuad(vi &rec)
{
    int m = 0;
    for (int i = 0; i < 4; ++i)
        m = (m << 1) | rec[i];
    vi ans(0);
    for (int i = 0; i < sz(messa); ++i)
    {
        for (int e : errors)
            if ((messa[i] ^ e) == m)
                ans.push_back(i);
    }
    return {ans[0], ans[1]};
}
pii receiveQuad()
{
    vi rec;
    for (int i = 0; i < 4; ++i)
        rec.push_back(receive());
    return evalQuad(rec);
}
std::pair<int, int> decode(int N)
{
    vpii interV = genIntervalls(N);
    while ((interV[0].second - interV[0].first) > 1)
    {
        splitInter(interV);

        // cout << "My Possibilies are: " << endl;
        // for (pii i : interV)
        //     cout << i.first << " - " << i.second << endl;

        pii ans = receiveQuad();
        filterPoss(interV, ans);
    }
    if (interV[1].second > N)
        interV[1].second = interV[0].second;
    // cout << "The Answer is: " << interV[0].second << " & " << interV[1].second << endl;
    return {interV[0].second, interV[1].second};
}

vi sendQuad(int x)
{
    vi rec;
    for (int i = 3; i >= 0; --i)
    {
        if (messa[x] & (1 << i))
            rec.push_back(send(1));
        else
            rec.push_back(send(0));
    }
    return rec;
}
void encode(int N, int X)
{
    --X;
    vpii interV = genIntervalls(N);
    while ((interV[0].second - interV[0].first) > 1)
    {
        splitInter(interV);

        // cout << "My Space is: " << endl;
        // for (pii i : interV)
        //     cout << i.first << " - " << i.second << endl;

        int m = 0; // correct quarter
        for (int i = 0; i < sz(interV); ++i)
            if (interV[i].first <= X && X < interV[i].second)
                m = i;

        // cout << "My m is : " << m << endl;

        vi rec = sendQuad(m);
        pii ans = evalQuad(rec);
        filterPoss(interV, ans);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...