Submission #1157508

#TimeUsernameProblemLanguageResultExecution timeMemory
1157508alexddParrots (IOI11_parrots)C++20
81 / 100
7 ms840 KiB
#include "encoder.h"
#include "encoderlib.h"
#include<bits/stdc++.h>
using namespace std;
vector<int> solve(const vector<int> sir)
{
    for(int cnt_id=0;cnt_id<8;cnt_id++)
    {
        int cnt_val = 8 - cnt_id;
        vector<int> v;
        for(int i=0;i<sir.size();i+=cnt_val)
        {
            v.push_back(0);
            for(int j=i;j<min(i+cnt_val,(int)sir.size());j++)
                if(sir[j]==1)
                    v.back() += (1<<(j-i));
        }
        int cate=0,cate2=0;
        for(int i=1;i<v.size();i++)
            if(v[i] < v[i-1])
                cate++;
            else if(v[i] > v[i-1])
                cate2++;
        if((1<<cnt_id) > cate)
        {
            vector<int> sol;
            int cur=0;
            for(int i=0;i<v.size();i++)
            {
                if(i>0 && v[i] < v[i-1])
                    cur++;
                sol.push_back((cur<<cnt_val) + v[i]);
            }
            for(int i=1;i<sol.size();i++)
                assert(sol[i]>=sol[i-1]);
            if((int)sol.size()%2==0) sol.push_back(255);
            //cerr<<cnt_id<<" cnt_id encoder\n";
            return sol;
        }
        if((1<<cnt_id) > cate2)
        {
            vector<int> sol;
            int cur=cate2;
            for(int i=0;i<v.size();i++)
            {
                if(i>0 && v[i] > v[i-1])
                    cur--;
                sol.push_back((cur<<cnt_val) + v[i]);
            }
            for(int i=1;i<sol.size();i++)
                assert(sol[i]<=sol[i-1]);
            //cerr<<cnt_id<<" cnt_id encoder\n";
            if((int)sol.size()%2==1) sol.push_back(0);
            return sol;
        }
    }
    assert(0);
}
void encode(int N, int M[])
{
    vector<int> sir;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<8;j++)
        {
            if((1<<j)&M[i])
                sir.push_back(1);
            else
                sir.push_back(0);
        }
    }
    assert((int)sir.size() == 8*N);

    vector<int> v = solve(sir);
    for(int x:v)
        send(x);
}
/*

*/
#include "decoder.h"
#include "decoderlib.h"
#include<bits/stdc++.h>
using namespace std;
void decode(int N, int lun, int X[])
{
    sort(X,X+lun);
    for(int cnt_val=1;;cnt_val++)
    {
        if(cnt_val*lun >= 8*N)
        {
            if(lun%2==0)
                reverse(X,X+lun);
            int cnt_id = 8 - cnt_val;
            vector<int> sir;
            for(int i=0;i<lun;i++)
            {
                for(int j=0;j<cnt_val;j++)
                {
                    if((1<<j)&X[i])
                        sir.push_back(1);
                    else
                        sir.push_back(0);
                }
            }
            for(int i=0;i<N;i++)
            {
                int val=0;
                for(int j=0;j<8;j++)
                    if(sir[i*8+j])
                        val += (1<<j);
                output(val);
            }
            return;
        }
    }
}
#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...