Submission #1105455

#TimeUsernameProblemLanguageResultExecution timeMemory
1105455jerzyk메시지 (IOI24_message)C++17
87.16 / 100
1270 ms1116 KiB
#include <bits/stdc++.h>
#include "message.h"

using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000LL * 1000LL * 1000LL * 1000LL * 1000LL * 1000LL;
const int II = 2 * 1000 * 1000 * 1000;
const int N = 1000 * 1000 + 7;
int sum[40];
vector<bool> M;
int il = 0, cnt = 0;

inline int S(int a, int b)
{
    return sum[b + 1] - sum[a];
}

bool Nxt()
{
    if(cnt >= (int)M.size()) return 0;
    return M[cnt++];
}

void send_message(vector<bool> _M, vector<bool> C)
{
    il = 0; cnt = 0;
    for(int i = 0; i < 36; ++i) sum[i] = 0;
    
    _M.pb(1);
    M = _M;
    vector<int> pos;
    vector<bool> bas(31, false);
    vector<vector<bool>> answer(100, bas);


    for(int i = 0; i < (int)C.size(); ++i)
    {
        sum[i + 1] = sum[i] + (int)(1 ^ C[i]);
        if(C[i] == 0)
            pos.pb(i);
    }
    int p = 0, k = 30;
    while(p + 1 < k)
    {
        //cerr << "BS1: " << p << " " << k << "\n";
        bool r = !(S(p, (p + k) / 2 - 1) >= (k - p + 2) / 4);
        if(p + 2 == k && C[p] == 0) r = 0;
        if(p + 2 == k && C[p] != 0) r = 1;
        for(int i = 0; i < (int)pos.size(); ++i)
        {
            if(pos[i] < p || pos[i] > k) answer[il][pos[i]] = Nxt();
            else answer[il][pos[i]] = r;
        }
        if(r)
            p = (p + k) / 2 + 1;
        else
            k = (p + k) / 2 - 1;
        ++il;
    }
    //cerr << "fp " << p << "\n";

    for(int i = 0; i < 30; ++i)
        if(i < p)
            answer[il + i][p] = C[i];
        else
            answer[il + i][p] = C[i + 1];
    
    for(int i = 0; i < 30; ++i)
        for(int j = 0; j < (int)pos.size(); ++j)
            if(pos[j] != p)
                answer[il + i][pos[j]] = Nxt();
    il += 29;
    while(cnt < (int)M.size())
    {
        ++il;
        for(int j = 0; j < (int)pos.size(); ++j)
            answer[il][pos[j]] = Nxt();
    }
    for(int i = 0; i <= il; ++i)
        send_packet(answer[i]);
    //cerr << "xd\n";
}

vector<bool> receive_message(vector<vector<bool>> R)
{
    il = 0; cnt = 0;
    int p = 0, k = 30;
    vector<int> pos;
    vector<pair<int, int>> ran;
    vector<bool> ans;
    while(p + 1 < k)
    {
        //cerr << "BS2: " << p << " " << k << "\n";
        ran.pb(make_pair(p, k));
        int bal = 0;
        for(int i = p; i <= k; ++i)
            bal += (int)R[il][i];
        if(bal < (k - p + 2) / 2)
            k = (p + k) / 2 - 1;
        else
            p = (p + k) / 2 + 1;
        ++il;
    }
    //cerr << "fp2 " << p << "\n";

    for(int i = 0; i < 30; ++i)
    {
        if(i == p) pos.pb(p);
        int dod = 0;
        if(i >= p) ++dod;
        if(R[il + i][p] == 0)
            pos.pb(i + dod);
    }
    if((int)pos.size() < 16) pos.pb(30);
    //cerr << "xd2\n";

    //cerr << R.size() << " Pos: \n";
    //for(int i = 0; i < (int)pos.size(); ++i)
        //cerr << pos[i] << " ";
    //cerr << "\n";

    for(int i = 0; i < il; ++i)
        for(int j = 0; j < (int)pos.size(); ++j)
            if(pos[j] < ran[i].st || pos[j] > ran[i].nd)
                ans.pb(R[i][pos[j]]);
    for(int i = 0; i < 30; ++i)
    {
        for(int j = 0; j < (int)pos.size(); ++j)
            if(pos[j] != p)
                ans.pb(R[il + i][pos[j]]);
    }
    il += 30;
    for(il = il; il < (int)R.size(); ++il)
        for(int j = 0; j < (int)pos.size(); ++j)
            ans.pb(R[il][pos[j]]);

    
    while(ans.back() == 0) ans.pop_back();
    ans.pop_back();

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...