Submission #1338109

#TimeUsernameProblemLanguageResultExecution timeMemory
1338109hyyhParrots (IOI11_parrots)C++20
98 / 100
6 ms836 KiB
#include "encoder.h"
#include "encoderlib.h"
#include <set> 
#include <bitset>
using namespace std;
using pii = pair<int,int>;
#define s second
#define f first

void encode(int N, int M[])
{
  bitset<512> bs;
  int cnt = 0;
  for(int i{};i < N;i++){
    for(int j{};j < 8;j++){
      bs[i*8+j] = (M[i]>>j)&1;
      cnt += bs[i*8+j];
    }
  }
  int save = 0;
  if(cnt > N*4){
    send(0);
    send(0);
    send(0);
    send(0);
    save = 1;
  }
  for(int i{};i < N*8;i++){
    if(bs[i] ^ save){
      if(i >= 256){
        send(i-256);
        send(i-256);
      }
      else send(i);
    }
  }
}

//2 bit position 1-4 -> 6 bit position
#include "decoder.h"
#include "decoderlib.h"
#include <bitset>
#include <iostream>
#include <map>

void decode(int N, int L, int X[])
{
  std::bitset<512> ans;
  std::map<int,int> mp;
  for(int i{};i < L;i++){
    if(!mp.count(X[i])) mp[X[i]] = 0;
    mp[X[i]]++;
  }
  int val = 1;
  if(!mp.count(0)) mp[0] = 0;
  int cnt = mp[0];
  if(cnt >= 4){
    val = 0;
    ans.set();
    cnt = 4;
  }
  else cnt = 0;
  mp[0] -= cnt;
  for(auto [a,b]:mp){
    if(b == 1 || b == 3){
      ans[a] = val;
    }
    if(b == 2 || b == 3){
      ans[a+256] = val;
    }
  }
  //cout << ans << endl;
  int cur = 0;
  for(int i{};i <= N*8;i++){
    if(i%8 == 0 && i != 0) output(cur),cur = 0;
    cur += ans[i]<<(i%8);
    //cout << cur << " -"<< endl;
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...