Submission #908641

#TimeUsernameProblemLanguageResultExecution timeMemory
908641GrandTiger1729Flight to the Ford (BOI22_communication)C++17
74 / 100
2285 ms3568 KiB
#include "communication.h"
#include <bits/stdc++.h>
using namespace std;

void encode(int N, int X)
{
    int ans = 0;
    vector<int> res[2];
    int x = 0;
    res[0].push_back(0);
    for (int y = 1; y <= 29; y++)
    {
        if (1 << y > N)
        {
            break;
        }
        int re[4]{};
        re[0] = send(X >> x & 1);
        re[1] = send(X >> y & 1);
        re[2] = send(X >> y & 1);
        if (re[1] == re[2])
        {
            ans ^= re[1] << y;
            continue;
        }
        re[3] = send(X >> x & 1);
        if (re[0] == re[3])
        {
            for (auto &i : res[0])
            {
                ans ^= re[0] << i;
            }
            for (auto &i : res[1])
            {
                ans ^= (!re[0]) << i;
            }
            res[0] = res[1] = vector<int>();
            res[0].push_back(y);
            x = y;
        }
        else
        {
            res[re[0] ^ re[1] ^ 1].push_back(y);
        }
    }
}

pair<int, int> decode(int N)
{
    int ans = 0;
    vector<int> res[2];
    int x = 0;
    res[0].push_back(0);
    for (int y = 1; y <= 29; y++)
    {
        if (1 << y > N)
        {
            break;
        }
        int re[4]{};
        re[0] = receive();
        re[1] = receive();
        re[2] = receive();
        if (re[1] == re[2])
        {
            ans ^= re[1] << y;
            continue;
        }
        re[3] = receive();
        if (re[0] == re[3])
        {
            for (auto &i : res[0])
            {
                ans ^= re[0] << i;
            }
            for (auto &i : res[1])
            {
                ans ^= (!re[0]) << i;
            }
            res[0] = res[1] = vector<int>();
            res[0].push_back(y);
            x = y;
        }
        else
        {
            res[re[0] ^ re[1] ^ 1].push_back(y);
        }
    }
    int ans1 = ans, ans2 = ans;
    for (auto &i : res[0])
    {
        ans1 ^= 1 << i;
    }
    for (auto &i : res[1])
    {
        ans2 ^= 1 << i;
    }
    ans1 = clamp(ans1, 1, N);
    ans2 = clamp(ans2, 1, N);
    return make_pair(ans1, ans2);
}

Compilation message (stderr)

communication.cpp: In function 'std::pair<int, int> decode(int)':
communication.cpp:52:9: warning: variable 'x' set but not used [-Wunused-but-set-variable]
   52 |     int x = 0;
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...