Submission #1140062

#TimeUsernameProblemLanguageResultExecution timeMemory
1140062Skymagic메시지 (IOI24_message)C++17
100 / 100
377 ms852 KiB
/********************
 * what  the  sigma *
 ********************/
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
using namespace std;
#define lgm cin.tie(0)->sync_with_stdio(0);
#define be(x) x.begin(),x.end()
#define ve vector
#define ll long long
#define ld long double
#define db(x) cout << "Debug at " << x << endl;
#define ull unsigned ll
#define f first
#define s second
#define pii pair<int, int>
#define tii tuple<int,int,int>
#define pll pair<ll,ll>
#define sz(x) (int)x.size()
#define pb push_back
const ll mod = 1e9+7,maxn=200005;
const ll INF=(ll)9e18;
std::vector<bool> send_packet(std::vector<bool> A);
void send_message(std::vector<bool> M, std::vector<bool> C) {
    ve<bool> first(31);
    ve<int> pos,dist;
    for (int i=0;i<31;i++) {
        if (!C[i]) {
            pos.pb(i);
        }
    }
    for (int i=1;i<16;i++) {
        dist.pb(pos[i]-pos[i-1]);
    }
    dist.pb(pos[0]-pos[15]+31);
    ve<ve<bool>> packets(66,ve<bool>(31));
    for (int i=0;i<16;i++) {
        for (int j=0;j<dist[i]-1;j++) {
            packets[j][pos[i]]=1;
        }
    }
    M.pb(1);
    while (sz(M)<1025) {
        M.pb(0);
    }
    int cur=0;
    for (int i=0;i<16;i++) {
        for (int j=dist[i];j<66;j++) {
            packets[j][pos[i]]=M[cur];
            cur++;
        }
    }
    for (int i=0;i<66;i++){
        send_packet(packets[i]);
    }
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
    ve<int> con(31),pos;
    for (int i=0;i<31;i++) {
        int p=0;
        con[i]=i+1;
        while (p<40) {
            if (R[p][i]) {
                con[i]++;
                p++;
            } else break;
        }
        con[i]%=31;
    }
    for (int i=0;i<31;i++) {
        int cur=i;
        bool f=0;
        for (int j=0;j<16;j++) {
            cur=con[cur];
            if (cur==i) {
                f=(j==15);
                break;
            }
        }
        if (f) {
            cur=i;
            for (int j=0;j<16;j++) {
                pos.pb(cur);
                cur=con[cur];
            }
            break;
        }
    }
    ve<bool> out;
    for (int i=0;i<16;i++) {
        for (int j=(con[pos[i]]-pos[i]+31)%31;j<66;j++) {
            out.pb(R[j][pos[i]]);
        }
    }
    while (!out.back()) {
        out.pop_back();
    }
    out.pop_back();
    return out;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...