Submission #146893

#TimeUsernameProblemLanguageResultExecution timeMemory
146893popovicirobertParrots (IOI11_parrots)C++14
82 / 100
34 ms2288 KiB
#include "encoder.h"
#include "encoderlib.h"
#include <bits/stdc++.h>

using namespace std;

void encode(int n, int M[]) {
    if(n > 32) {
        for(int i = 0; i < n; i++) {
            int cur = (i << 2);
            for(int j = 0; j < 8; j++) {
                send(cur | (M[i] >> 6));
            }
            for(int j = 0; j < 4; j++) {
                send(cur | ((M[i] >> 4) & 3));
            }
            for(int j = 0; j < 2; j++) {
                send(cur | ((M[i] >> 2) & 3));
            }
            send(cur | (M[i] & 3));
        }
        return ;
    }
    for(int i = 0; i < n; i++) {
        int cur = (i << 3);
        for(int j = 0; j < 4; j++) {
            send(cur | (M[i] >> 5));
        }
        for(int j = 0; j < 2; j++) {
            send(cur | ((M[i] >> 2) & ((1 << 3) - 1)));
        }
        send(cur | (M[i] & ((1 << 2) - 1)));
    }
}
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>

using namespace std;

void decode(int n, int l, int X[]) {
    vector < vector <int> > pos(l);
    if(n > 32) {
        for(int i = 0; i < l; i++) {
            pos[X[i] >> 2].push_back(X[i] & 3);
        }
        for(int i = 0; i < n; i++) {
            map <int, int> mp;
            for(auto it : pos[i]) {
                mp[it]++;
            }
            int cur = 0;
            for(int j = 3; j >= 0; j--) {
                for(auto &it : mp) {
                    if(it.second >= (1 << j)) {
                        cur = (cur << 2) + it.first;
                        it.second -= (1 << j);
                        break;
                    }
                }
            }
            output(cur);
        }
        return ;
    }
    for(int i = 0; i < l; i++) {
        pos[X[i] >> 3].push_back(X[i] & ((1 << 3) - 1));
    }
    for(int i = 0; i < n; i++) {
        map <int, int> mp;
        for(auto it : pos[i]) {
            mp[it]++;
        }
        int cur = 0;
        for(auto &it : mp) {
            if(it.second >= 4) {
                cur = (cur << 3) + it.first;
                it.second -= 4;
                break;
            }
        }
        for(auto &it : mp) {
            if(it.second >= 2) {
                cur = (cur << 3) + it.first;
                it.second -= 2;
                break;
            }
        }
        for(auto it : mp) {
            if(it.second) {
                cur = (cur << 2) + it.first;
                break;
            }
        }
        output(cur);
    }
}
#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...