| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1313575 | 1ota | Message (IOI24_message) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "message.h"
using namespace std;
#define endl "\n"
#define int long long
#define pii pair<int, int>
#define ff first
#define ss second
#define entire(x) (x).begin(), (x).end()
int n = 1025;
void send_message(vector<bool> m, vector<bool> c){
reverse(entire(m)); m.push_back(true);
while ((int) m.size() < n) m.push_back(false);
reverse(entire(m));
int fg = 0;
for (; c[fg] == false; fg++);
int idx = 0;
for (int bit = 0; bit < 31; bit++){
if (bit == fg) continue;
vector<bool> cur(31, false);
cur[fg] = c[bit];
for (int i = fg + 1; i < 31; i++) if (c[i]) cur[i] = m[idx++];
send_packet(cur);
}
while (idx < n){
vector<bool> cur(31, false);
for (int i = fg; i < 31 and idx < n; i++) if (c[i]) cur[i] = m[idx++];
send_packet(cur);
}
int len = 0;
// 1 + 2 + 4 + 8 + 16 = 31 !!
// 0 -> 1 -> 2 -> 3 -> 4
for (; (1 << len) < fg; len++) fg -= (1 << len);
for (int i = 0; i < len; i++){
vector<bool> cur(n, false);
if ((1 << i) & fg) fill(entire(cur), true);
send_packet(cur);
}
}
// vector<bool> send_packet (vector<bool> a) {
// }
vector<bool> recieve_message (vector<vector<bool>> r){
// len would always be 66 or more
int nr = (int) r.size(), len = nr - 66;
int fg = (1 << len) - 1;
for (int i = nr - 1; i > nr - 1 - len; i--){
int cnt1 = count(entire(r[i]), true);
if (cnt1 >= 16) fg += (1 << (nr - 1 - i));
}
vector<int> idx{fg};
vector<bool> c(n, false); c[fg] = true;
for (int bit = 0; bit < 31; bit++){
if (bit == fg) continue;
c[bit] = r[bit - (bit > fg)][fg];
if (c[bit]) idx.push_back(bit);
}
vector<bool> ans;
for (int i = 0; i < 30; i++){
for (int bit : idx) if (bit != fg){
ans.push_back(r[i][bit]);
}
}
for (int i = 30; i < 66; i++){
for (int bit : idx) ans.push_back(r[i][bit]);
}
int fon = 0;
for (; ans[fon] == false; fon++);
vector<bool> actual;
for (int i = fon + 1; i < (int) ans.size(); i++) actual.push_back(ans[i]);
return actual;
}
