제출 #235625

#제출 시각아이디문제언어결과실행 시간메모리
235625DavidDamian앵무새 (IOI11_parrots)C++11
96 / 100
17 ms1792 KiB
#include "encoder.h"
#include "encoderlib.h"
#include<bits/stdc++.h>
using namespace std;
void encode(int N, int M[])
{
    if(N<=32){
        int idx=0;
        for(int i=0;i<N;i++){
            for(int bit=0;bit<8;bit++){
                if(M[i]&(1<<bit))
                    send(idx+bit);
            }
            idx+=8;
        }
    }
    else{
        vector<int> bits(8*N,0);
        int idx=0;
        int sum=0;
        for(int i=0;i<N;i++){
            for(int bit=0;bit<8;bit++){
                if(M[i]&(1<<bit))
                    bits[idx+bit]=1,sum++;
            }
            idx+=8;
        }
        int scheme=(sum<=(N/2))? 1 : 0;
        for(int i=0;i<8*N;i+=2){
            int cnt=0;
            cnt+=bits[i];
            cnt+=(bits[i+1]<<1);
            if(scheme==0) cnt=3-cnt;
            while(cnt--)
                send(i/2);
        }
        if(scheme==0){
            send(255);
            send(255);
            send(255);
            send(255);
        }
    }
}
#include "decoder.h"
#include "decoderlib.h"
#include<bits/stdc++.h>
using namespace std;
void decode(int N, int L, int X[])
{
    if(N<=32){
        vector<int> binary(8*N,0);
        sort(X,X+L);
        for(int i=0;i<L;i++){
            binary[X[i]]=1;
        }
        for(int i=0;i<8*N;i+=8){
            int number=0;
            for(int bit=0;bit<8;bit++){
                if(binary[i+bit]) number+=(1<<bit);
            }
            output(number);
        }
    }
    else{
        vector<int> bucket(256,0);
        vector<int> bits(8*N,0);
        for(int i=0;i<L;i++){
            bucket[ X[i] ]++;
        }
        int scheme=(bucket[255]>=4)? 0 : 1;
        for(int i=0;i<4*N;i++){
            int cnt=bucket[i];
            if(i==255 && scheme==0) cnt-=4;
            if(scheme==0) cnt=3-cnt;
            if(cnt==1)
                bits[2*i]=1;
            else if(cnt==2)
                bits[2*i+1]=1;
            else if(cnt==3)
                bits[2*i]=bits[2*i+1]=1;
        }
        int idx=0;
        for(int i=0;i<N;i++){
            int number=0;
            for(int bit=0;bit<8;bit++){
                if(bits[idx+bit]) number+=(1<<bit);
            }
            idx+=8;
            output(number);
        }
    }
}
#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...