Submission #1316719

#TimeUsernameProblemLanguageResultExecution timeMemory
1316719SmuggingSpunMessage (IOI24_message)C++20
100 / 100
397 ms896 KiB
#include "message.h"
#include<bits/stdc++.h>
using namespace std;
void send_message(vector<bool>M, vector<bool>C){
  vector<vector<bool>>send(66, vector<bool>(31, false));
  vector<pair<int, int>>can_use;
  for(int i = 0; i < 31; i++){
    if(!C[i]){
      int cnt = 1;
      while(C[(i + cnt) % 31]){
        cnt++;
      }
      send[cnt - 1][i] = true;
      for(int j = cnt; j < 66; j++){
        can_use.push_back(make_pair(j, i));
      } 
    }
  }
  for(int i = 0; i < 1025; i++, can_use.pop_back()){
    send[can_use.back().first][can_use.back().second] = (i < M.size() ? M[i] : !M.back());
  }
  for(int i = 0; i < 66; i++){
    send_packet(send[i]);
  }
}
vector<bool>receive_message(vector<vector<bool>>R){
  vector<int>nxt(31, -1), cnt(31);
  for(int i = 0; i < 31; i++){
    for(int j = 0; j < 66; j++){
      if(R[j][i]){
        nxt[i] = (i + (cnt[i] = j + 1)) % 31;
        break;
      }
    }
  }
  vector<pair<int, int>>can_use;
  for(int i = 0; i < 31; i++){
    vector<bool>vis(31, false);
    bool flag = true;
    vis[i] = true;
    int x = i;
    for(int j = 1; j < 16; j++, vis[x] = true){
      if((x = nxt[x]) == -1 || vis[x]){
        flag = false;
        break;
      }
    }
    if(flag && nxt[x] == i){
      for(int j = i; j < 31; j++){
        if(vis[j]){
          for(int k = cnt[j]; k < 66; k++){
            can_use.push_back(make_pair(k, j));
          }
        }
      }
      break;
    }
  }
  vector<bool>ans(1025);
  for(int i = 0; i < 1025; i++, can_use.pop_back()){
    ans[i] = R[can_use.back().first][can_use.back().second];
  }
  bool out = ans.back();
  while(ans.back() == out){
    ans.pop_back();
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...