Submission #1193809

#TimeUsernameProblemLanguageResultExecution timeMemory
1193809NeltMessage (IOI24_message)C++20
0 / 100
0 ms840 KiB
#include "message.h"
#include <bits/stdc++.h>
#define endl "\n"
#define ll long long
using namespace std;

void send_message(vector<bool> a, vector<bool> c)
{
    vector<bool> msg(31, 0);
    vector<ll> fixed;
    ll ptr = 0, first = 0;
    while (c[first]) first++;
    for (ll i = 0; i < 4; i++) send_packet(vector<bool>(31, c[first] >> i & 1));
    fixed.push_back(first);
    ptr = 1;
    while (ptr < 31)
    {
        if (fixed.empty())
        {
            send_packet(vector<bool>(31, c[ptr]));
            if (c[ptr] == 0)
                fixed.push_back(ptr);
            ptr++;
        }
        else
        {
            ll sz = fixed.size();
            for (ll i = 0; i < sz and ptr < 31; i++, ptr++)
            {
                msg[fixed[i]] = c[ptr];
                if (c[ptr] == 0)
                    fixed.push_back(ptr);
            }
            send_packet(msg);
        }
    }
    if (fixed.size() != 16) exit(0);
    for (ll i = 0; i < 16; i++)
        msg[fixed[i]] = (a.size() >> i & 1);
    send_packet(msg);
    for (ll i = 0; i < a.size(); i += 16)
    {
        for (ll j = 0; j + i < a.size() and j < 16; j++)
            msg[fixed[j]] = a[i + j];
        send_packet(msg);
    }
}
bool majority(vector<bool> &c)
{
    return count(c.begin(), c.end(), 1) >= 16;
}
vector<bool> receive_message(vector<vector<bool>> a)
{
    vector<bool> c(31, 1);
    ll ptr = 0, cur = 0;
    vector<ll> fixed;
    fixed.push_back(0);
    for (; cur < 4; cur++) if (majority(a[cur])) fixed.back() |= 1 << cur;
    ptr = 1;
    while (ptr < 31)
    {
        if (fixed.empty())
        {
            c[ptr] = majority(a[cur]);
            cur++;
            if (c[ptr] == 0)
                fixed.push_back(ptr);
            ptr++;
        }
        else
        {
            ll sz = fixed.size();
            for (ll i = 0; i < sz and ptr < 31; i++, ptr++)
            {
                c[ptr] = a[cur][fixed[i]];
                if (c[ptr] == 0)
                    fixed.push_back(ptr);
            }
            cur++;
        }
    }
    ll sz = 0;
    for (ll i = 0; i < 16; i++)
        if (a[cur][fixed[i]])
            sz += 1 << i;
    vector<bool> ans(sz);
    for (ll i = 0; i < sz; i++)
        ans[i] = a[cur + 1 + (i >> 4)][fixed[i & 15]];
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...