Submission #1298321

#TimeUsernameProblemLanguageResultExecution timeMemory
1298321tuandq메시지 (IOI24_message)C++20
53.89 / 100
469 ms828 KiB
#include <bits/stdc++.h> using namespace std ; vector<bool> send_packet(vector<bool> A); vector<vector<bool>> encode(int num, const int &d) { vector<vector<bool>> res ; for(int i = d - 1; i > -1; i --) { res.emplace_back(vector<bool>(31, (bool)(num >> i & 1))) ; } return res ; } void send_message(vector<bool> M, vector<bool> C) { // SEND C WITH OPTIMIZATIONS int ma = 0, pos = -1 ; for(int i = 0; i < 31; i ++) if(!C[i]) { int j = i ; while(j < 30 && !C[j + 1]) ++ j ; if(j - i + 1 > ma) { ma = j - i + 1 ; pos = i ; } i = j ; } if(ma == 1) { vector<vector<bool>> buck = encode(31, 5) ; for(vector<bool> &cur : buck) { send_packet(cur) ; } } else { vector<vector<bool>> buck = encode(pos, 5) ; for(vector<bool> &cur : buck) { send_packet(cur) ; } int k = pos - 1, l = pos + 2, key = -1 ; if(!pos) k = l, ++ l ; else if(pos == 29) l = k, -- k ; vector<bool> pack(31, false) ; pack[pos] = C[k] ; pack[pos + 1] = C[l] ; key = (!C[k] ? k : (!C[l] ? l : -1)) ; send_packet(pack) ; vector<int> indices ; int le = min(pos, k), ri = max(pos + 1, l) ; for(int i = 0; i < 31; i ++) { if(i >= le && i <= ri) continue ; indices.emplace_back(i) ; // cerr << i << ' ' ; } //assert for(int i = 2; i < indices.size(); i += 3) { int u = indices[i - 2] ; int v = indices[i - 1], w = indices[i] ; vector<bool> pack(31, false) ; pack[pos] = C[u] ; pack[pos + 1] = C[v] ; // cerr << "-> " << pos << ' ' << u << ' ' << C[u] << ' ' << pos + 1 << ' ' << v << ' ' << C[v] << endl ; if(key == -1) { for(int r : indices) pack[r] = C[w] ; } else { pack[key] = C[w] ; } send_packet(pack) ; } } // SEND MESSAGE STRAIGHTLY FOWARD vector<int> idx ; for(int i = 0; i < 31; i ++) { if(!C[i]) idx.emplace_back(i) ; } int s = (int)M.size() - 1 ; reverse(M.begin(), M.end()) ; for(int i = 0; i < 10; i ++) { M.emplace_back((bool)(s >> i & 1)) ; } reverse(M.begin(), M.end()) ; for(int i = 0; i < M.size();) { vector<bool> pack(31, false) ; int x = min((int)M.size() - i, 16) ; for(int j = 0; j < x; j ++) { pack[idx[j]] = M[i] ; ++ i ; } send_packet(pack) ; } } vector<bool> receive_message(vector<vector<bool>> R) { // DECODE THE STRING C int pos = 0 ; for(int i = 0; i < 5; i ++) { vector<int> cnt(2, 0) ; for(int j = 0; j < 31; j ++) { ++ cnt[(int)R[i][j]] ; } pos = pos << 1 | ((int)(cnt[1] > cnt[0])) ; } vector<bool> C(31, true) ; int num = 5 ; if(pos == 31) { for(int d = 0; d < 31; d += 2) C[d] = false ; } else { num = 15 ; C[pos] = C[pos + 1] = false ; int k = pos - 1, l = pos + 2, key = -1 ; if(!pos) k = l, ++ l ; else if(pos == 29) l = k, -- k ; vector<int> indices ; int le = min(pos, k), ri = max(pos + 1, l) ; for(int i = 0; i < 31; i ++) { if(i >= le && i <= ri) continue ; indices.emplace_back(i) ; } C[k] = R[5][pos] ; C[l] = R[5][pos + 1] ; key = (!C[k] ? k : (!C[l] ? l : -1)) ; int iter = 2 ; for(int i = 6; i < num; i ++, iter += 3) { int u = indices[iter - 2] ; int v = indices[iter - 1], w = indices[iter] ; C[u] = R[i][pos] ; C[v] = R[i][pos + 1] ; // cerr << "<- " << pos << ' ' << u << ' ' << R[i][pos] << ' ' << pos + 1 << ' ' << v << ' ' << R[i][pos + 1] << " | " << w << endl ; if(key == -1) { vector<int> cnt(2, 0) ; for(int r : indices) ++ cnt[(int)R[i][r]] ; C[w] = (cnt[1] > cnt[0]) ; } else { C[w] = R[i][key] ; } } } // cerr << "Finished decoding C\n" ; // DECODE THE SIZE OF MESSAGE AND ITS BITS vector<int> idx ; for(int i = 0; i < 31; i ++) { if(!C[i]) idx.emplace_back(i) ; } int numSz = 0 ; for(int i = 0; i < 10; i ++) { numSz = numSz << 1 | ((int)R[num][idx[i]]) ; } ++ numSz ; int iter = 9 ; vector<bool> res ; for(; numSz > 0; numSz --) { if(++ iter == 16) iter = 0, ++ num ; res.emplace_back(R[num][idx[iter]]) ; } return res ; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...