Submission #1336616

#TimeUsernameProblemLanguageResultExecution timeMemory
1336616tvgk메시지 (IOI24_message)C++20
81.45 / 100
449 ms852 KiB
#include "message.h"
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 2e5 + 7;

bool Check_bit(int u, int v)
{
    return (u >> v) & 1;
}

vector<bool> all(bool tt)
{
    vector<bool> res;
    for (int i = 0; i < 31; i++)
        res.push_back(tt);
    return res;
}

void send_message(std::vector<bool> M, std::vector<bool> C)
{
    int val = M.back() ^ 1;
    while (M.size() < 1025)
        M.push_back(val);

    vector<int> vt;
    for (int j = 0; j < C.size(); j++)
    {
        C[j] = !C[j];

        if (!C[j])
            continue;
        vt.push_back(j);
    }

//    cerr << "VT ";
//    for (int i : vt)
//        cerr << i << " ";
//    cerr << '\n';

    for (int i = 0; i < 4; i++)
        send_packet(all(Check_bit(vt[0], i)));

    vector<vector<bool>> res;
    for (int i = 0; i < 66; i++)
        res.push_back(C);

    vector<bool> nw;
    for (bool j : C)
        nw.push_back(j);
    for (bool j : M)
        nw.push_back(j);

    for (int i = 0; i < nw.size(); i++)
        res[i % 66][vt[i / 66]] = nw[i];

    for (vector<bool> i : res)
        send_packet(i);
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R)
{
    vector<int> vt;
    int stt = 0;
    for (int i = 0; i < 4; i++)
    {
        int cnt = 0;
        for (int j : R[i])
        {
            if (j)
                cnt++;
            else
                cnt--;
        }

        if (cnt > 0)
            stt += (1 << i);
    }

    vector<bool> ans;
    for (int i = 0; i < 16; i++)
    {
        if (vt.size())
            stt = vt[i];

        for (int j = 4; j < 70; j++)
        {
            if (R[j][stt])
                vt.push_back(j - 4);
            ans.push_back(R[j][stt]);
        }
    }

//    cerr << "C: ";
//    for (int j = 0; j < 16; j++)
//        cerr << vt[j] << " ";
//    cerr << '\n';

    vector<bool> nw;
    for (int i = 31; i < ans.size(); i++)
        nw.push_back(ans[i]);
    ans = nw;

    int tmp = ans.back();
    while (ans.back() == tmp)
        ans.pop_back();
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...