제출 #422873

#제출 시각아이디문제언어결과실행 시간메모리
422873pliam앵무새 (IOI11_parrots)C++14
81 / 100
5 ms1164 KiB
#include "encoder.h"
#include "encoderlib.h"

void sendcnt(int a,int x){
  for(int i=0;i<x;i++){
    send(a);
  }
}

void encode(int N, int M[])
{
  if(N<=32){
    //binary system
    for(int num=0;num<N;num++){
      int pos=0;
      while(M[num]>0){
        if(M[num]&1){
          send((num<<3)|pos);
        }
        M[num]>>=1;
        pos++;
      }
    }
  }else{
    //4-ary system
    int cnt1=0,cnt2=0;
    for(int num=0;num<N;num++){
      int pos=0;
      int tmp=M[num];
      while(tmp>0){
        int cnt=tmp&3;//mod4=mod(2^2), we keep last 2 digits
        cnt1+=cnt;
        cnt2+=(3-cnt);
        tmp>>=2;
        pos++;
      }
    }
    bool change=(cnt2<cnt1);
    if(change) sendcnt(255,4);
    for(int num=0;num<N;num++){
      int pos=0;
      while(M[num]>0){
        int cnt=M[num]&3;//mod4=mod(2^2), we keep last 2 digits
        sendcnt((num<<2)|pos,change?(3-cnt):cnt);
        M[num]>>=2;
        pos++;
      }
    }
  }
}
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>
using namespace std;

void decode(int N, int L, int X[])
{
  map<int,int> freq;
  for(int i=0;i<L;i++){
    freq[X[i]]++;
  }
  if(N<=32){
    //binary system
    for(int num=0;num<N;num++){
      int val=0;
      for(int pos=0;pos<8;pos++){
        int mask=(num<<3)|pos;
        if(freq.count(mask)){
          val|=(1<<pos);
        }
      }
      output(val);
    }
  }else{
    //4-ary system
    bool change=false;
    if(freq.count(255)){
      if(freq[255]>=4){
        change=true;
        freq[255]-=4;
      }
    }
    for(int num=0;num<N;num++){
      int val=0;
      for(int pos=0;pos<4;pos++){
        int mask=(num<<2)|pos;
        if(freq.count(mask)){
          val|=(1<<(2*pos))*(change?3-freq[mask]:freq[mask]);
        }else{
          val|=(1<<(2*pos))*(change?3:0);
        }
      }
      output(val);
    }
  }
}
#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...