Submission #1141097

#TimeUsernameProblemLanguageResultExecution timeMemory
1141097hyl_kibou앵무새 (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;
    int sum4 = 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);
            if(j<2){
                sum4 += 3-a%4;
            }
            else{
                sum4 += a%4;
            }

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


    //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;
        curr = sum1+sum2-sum3;
    }
    if(curr>sum4){
        extra = 252;
    }

    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];
            }
        }
        if(extra ==252){
            if(i%4<2){
                curr = inv[i];
            }
            else{
                curr = nor[i];
            }
        }

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

    }

    int cat = 1;

    if(N==64){
        cat = 4;
    }

    for(int i = 0; i<cat; ++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]];
  }

  int cat = 1;

  if(N==64){
    cat = 4;
  }

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

    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]>=cat){
    arr[253]-=cat;

    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]>=cat){
    arr[254]-=cat;

    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;
  }
  if(arr[252]>=cat){
    arr[252]-=cat;

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

        sum+=3-arr[i];
        sum+=(3-arr[i+1])*4;
        sum+=(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...