Submission #7717

#TimeUsernameProblemLanguageResultExecution timeMemory
7717baneling100Parrots (IOI11_parrots)C++98
100 / 100
11 ms2432 KiB
#include "encoder.h"
#include "encoderlib.h"

static int A[21];
static long long C[41][41];

long long static H(int X, int Y) {

    return C[X+Y-1][X];
}

void static MakeSequence(long long Num, int K) {

    int i, j;
    long long Temp;

    for(i=1 ; i<=K ; i++)
        for(j=A[i-1] ; j<=16 ; j++) {
            Temp=H(K-i,17-j);
            if(Num<=Temp || !Temp) {
                A[i]=j;
                break;
            }
            else
                Num-=Temp;
        }
}

void encode(int N, int M[]) {

    int i, j;
    long long Num;

    for(i=1 ; i<=40 ; i++) {
        C[i][0]=C[i][i]=1;
        for(j=1 ; j<=i-1 ; j++)
            C[i][j]=C[i-1][j-1]+C[i-1][j];
    }
    for(i=3 ; i<N ; i+=4) {
        Num=(long long)M[i-3]+(long long)256*M[i-2]+(long long)256*256*M[i-1]+(long long)256*256*256*M[i];
        MakeSequence(Num,20);
        for(j=1 ; j<=20 ; j++)
            if(A[j]!=16)
                send((i/4)+(A[j]<<4));
    }
    if(N%4==1) {
        Num=(long long)M[N-1];
        MakeSequence(Num,5);
        for(j=1 ; j<=5 ; j++)
            if(A[j]!=16)
                send(((N-1)/4)+(A[j]<<4));
    }
    else if(N%4==2) {
        Num=(long long)M[N-2]+(long long)256*M[N-1];
        MakeSequence(Num,10);
        for(j=1 ; j<=10 ; j++)
            if(A[j]!=16)
                send(((N-1)/4)+(A[j]<<4));
    }
    else if(N%4==3) {
        Num=(long long)M[N-3]+(long long)256*M[N-2]+(long long)256*256*M[N-1];
        MakeSequence(Num,15);
        for(j=1 ; j<=15 ; j++)
            if(A[j]!=16)
                send(((N-1)/4)+(A[j]<<4));
    }
}
#include "decoder.h"
#include "decoderlib.h"
#include <algorithm>

using namespace std;

static int M, Group[16][21], Cnt[16], Ans[65], Len;
static long long C[41][41];

long long static H(int X, int Y) {

    return C[X+Y-1][X];
}

long long static RemoveSequence(int X, int Y) {

    int i, j;
    long long Num=0;

    for(i=1 ; i<=Y ; i++)
        for(j=Group[X][i-1] ; j<Group[X][i] ; j++)
            Num+=H(Y-i,17-j);
    if(Num)
        Num++;
    return Num;
}

void decode(int N, int L, int X[]) {

    int i, j, Temp1, Temp2;
    long long Num;

    for(i=0 ; i<=15 ; i++)
        Cnt[i]=0;
    Len=0;
    for(i=1 ; i<=40 ; i++) {
        C[i][0]=C[i][i]=1;
        for(j=1 ; j<=i-1 ; j++)
            C[i][j]=C[i-1][j-1]+C[i-1][j];
    }
    M=N/4;
    for(i=0 ; i<L ; i++) {
        Temp2=(X[i]>>4);
        Temp1=X[i]-(Temp2<<4);
        Group[Temp1][++Cnt[Temp1]]=Temp2;
    }
    for(i=0 ; i<M ; i++) {
        for(j=Cnt[i]+1 ; j<=20 ; j++)
            Group[i][j]=16;
        sort(Group[i]+1,Group[i]+21);
        Num=RemoveSequence(i,20);
        for(j=1 ; j<=4 ; j++) {
            Ans[++Len]=Num%256;
            Num/=256;
        }
    }
    if(N%4==1) {
        for(j=Cnt[M]+1 ; j<=5 ; j++)
            Group[M][j]=16;
        sort(Group[M]+1,Group[M]+6);
        Num=RemoveSequence(M,5);
        Ans[++Len]=Num%256;
        Num/=256;
    }
    else if(N%4==2) {
        for(j=Cnt[M]+1 ; j<=10 ; j++)
            Group[M][j]=16;
        sort(Group[M]+1,Group[M]+11);
        Num=RemoveSequence(M,10);
        for(j=1 ; j<=2 ; j++) {
            Ans[++Len]=Num%256;
            Num/=256;
        }
    }
    else if(N%4==3) {
        for(j=Cnt[M]+1 ; j<=15 ; j++)
            Group[M][j]=16;
        sort(Group[M]+1,Group[M]+16);
        Num=RemoveSequence(M,15);
        for(j=1 ; j<=3 ; j++) {
            Ans[++Len]=Num%256;
            Num/=256;
        }
    }
    for(i=1 ; i<=N ; i++)
        output(Ans[i]);
}
#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...