Submission #1141027

#TimeUsernameProblemLanguageResultExecution timeMemory
1141027hyl_kibouParrots (IOI11_parrots)C++17
98 / 100
5 ms840 KiB
#include "encoder.h"
#include "encoderlib.h"

#include <vector>

void encode(int N, int M[])
{
    int nor[N*4+7];
    int inv[N*4+7];

    int a;
    int sum1 = 0;
    int sum2 = 0;
    int sum3 = 0;


    for(int i = 0; i<N; ++i){
        int a = M[i];
        for(int j = 0; j<4; ++j){
           nor[i*4+j] = a%4;
           sum1 += a%4;
           inv[i*4+j] = 3-a%4;
           sum2 += 3-a%4;

           if(j%2){
                sum3 += a%4;
                //printf("%d %d\n", sum3);
           }
           else{
                sum3 += 3-a%4;
                //printf("%d %d\n", sum3);
           }
            //printf("%d %d %dY0\n", i, j, sum3);

           a/=2;
           a/=2;
        }
    }

    /*
    for(int i = 0; i<N*4; ++i){

        printf("%d ", nor[i]);

    }
    printf("\n");

    for(int i = 0; i<N*4; ++i){

        printf("%d ", inv[i]);

    }
    printf("\n");

    for(int i = 0; i<N*4; ++i){

        if(i%2){
            printf("%d ", nor[i]);
        }
        else{
            printf("%d ", inv[i]);
        }

    }
    printf("\n");
    //*/


    //printf("%d %d %d %d\n", sum1, sum2, sum3, sum1+sum2-sum3);


    int extra = 256;
    int curr = sum1-4;


    if(curr>sum2){
        extra = 255;
        curr = sum2;
    }
    if(curr>sum3){
        extra = 254;
        curr = sum3;
    }
    if(curr>sum1+sum2-sum3){
        extra = 253;
    }

    for(int i = 0; i<N*4; ++i){
        if(extra == 256){
            curr = nor[i];
        }
        if(extra == 255){
            curr = inv[i];
        }
        if(extra == 254){
            if(i%2){
                curr = nor[i];
            }
            else{
                curr = inv[i];
            }
        }
        if(extra == 253){
            if(i%2){
                curr = inv[i];
            }
            else{
                curr = nor[i];
            }
        }

        for(int j = 0; j<curr; ++j){
            //printf("%d_", i);
            send(i);
        }

    }

    for(int i = 0; i<4; ++i){
        if(extra!=256){
            send(extra);
        }
    }

    //send();
}
#include "decoder.h"
#include "decoderlib.h"
#include <algorithm>

//int exo[] = {1, 2, 4, 8, 16, 32, 64, 128};

void decode(int N, int L, int X[])
{
  std::sort(X, X+L);

  int arr[256] = {};

  for(int i = 0; i<L; ++i){
    ++arr[X[i]];
  }

  if(arr[255]>=4){
    arr[255]-=4;

    for(int i = 0; i<N*4; i+=4){
        int sum = 0;
        sum+=3-arr[i];
        sum+=(3-arr[i+1])*4;
        sum+=(3-arr[i+2])*16;
        sum+=(3-arr[i+3])*64;
        output(sum);
    }
    return;
  }
  if(arr[253]>=4){
    arr[253]-=4;

    for(int i = 0; i<N*4; i+=4){
        int sum = 0;

        sum+=arr[i];
        sum+=(3-arr[i+1])*4;
        sum+=(arr[i+2])*16;
        sum+=(3-arr[i+3])*64;
        output(sum);
    }
    return;
  }

  if(arr[254]>=4){
    arr[254]-=4;

    for(int i = 0; i<N*4; i+=4){
        int sum = 0;

        sum+=3-arr[i];
        sum+=(arr[i+1])*4;
        sum+=(3-arr[i+2])*16;
        sum+=(arr[i+3])*64;
        //printf("%d ", sum);
        output(sum);
    }
    return;
  }

    for(int i = 0; i<N*4; i+=4){
        int sum = 0;
        sum+=arr[i];
        sum+=(arr[i+1])*4;
        sum+=(arr[i+2])*16;
        sum+=(arr[i+3])*64;
        output(sum);
    }

  //output();
}
#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...