Submission #1130532

#TimeUsernameProblemLanguageResultExecution timeMemory
1130532ThylOneMessage (IOI24_message)C++20
0 / 100
508 ms856 KiB
#include "message.h"
#include <algorithm>
#include<bits/stdc++.h>

using namespace std;
void send_message(std::vector<bool> M, std::vector<bool> C) {
    vector<int> pos_mine;
    for (int i = 0; i < 31; i++)
      if (!C[i])
        pos_mine.push_back(i);

    //On ajoute le hot one flag
    reverse(M.begin(),M.end()); // On reverse l'ordre du message
    M.push_back(1);
    while(M.size()!=1025)M.push_back(0);
    reverse(M.begin(),M.end());

    //On ajoute le hot one flag
    //On crée les futurs packets
    vector<vector<bool>> packets(66);
    vector<vector<bool>> writen(66);
    for(int i = 0;i<66;i++)packets[i].resize(31,false);
    for(int i = 0;i<66;i++)writen[i].resize(31,false);

    //On encode le graphe fonctionnel
    for(int i = 0;i<16;i++){
        int nxt_pos = abs(pos_mine[(i+1)%16]-pos_mine[i]);
        
        for(int j=0;j<nxt_pos-1;j++){
            packets[j][pos_mine[i]] =  0;
            writen[j][pos_mine[i]] = 1;
        }
        packets[nxt_pos][pos_mine[i]] = 1;
        writen[nxt_pos][pos_mine[i]] = 1;
    }

    //On écrit le message aux endroits restants
    int act_bit = 0;
    for(int p =0;p<66;p++){
        for(int m:pos_mine){
          if(!writen[p][m]){
            packets[p][m] = M[act_bit++];
          }
        }
    }
    for(int i = 0;i<66;i++){
      send_packet(packets[i]);
    }
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
  vector<bool> re;

  int nxt[31];
  bool readable[66][31];
  for(int p = 0;p<66;p++)
    fill(readable[p],readable[p]+31,true);

  for(int i = 0;i<31;i++){
    nxt[i] = 0;
    while(R[nxt[i]][i] == 0 && nxt[i]<31){
      readable[nxt[i]++][i] = false;
    }
    readable[nxt[i]][i] = false;   
  }
  vector<int> mine;
  for(int i = 0;i<31;i++){
    vector<int> composante;
    vector<bool> mem(31,false);
    int act = i;
    while(mem[act] == false){
      composante.push_back(act);
      mem[act] = true;
      act = (act + nxt[act])%31;
    }
    if(composante.size()==16){
      mine = composante;break;
    }
  }

  //Maintenant on a que à lire le msg
  bool OK = false;
  for(int p = 0;p<66;p++){
    for(int i :mine){
      if(!readable[p][i])continue;
      if(OK)re.push_back(R[p][i]);
      if(R[p][i]==1)OK=true;
    }
  }
  return std::vector<bool>({0, 1, 1, 0});
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...