Submission #1157503

#TimeUsernameProblemLanguageResultExecution timeMemory
1157503alexddParrots (IOI11_parrots)C++20
81 / 100
8 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;
        for(int i=1;i<v.size();i++)
            if(v[i] < v[i-1])
                cate++;
        if((1<<cnt_id) <= cate)
            continue;
        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]);
        //cerr<<cnt_id<<" cnt_id encoder\n";
        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);
    if((int)v.size()%2==0) v.push_back(255);

    reverse(sir.begin(),sir.end());
    vector<int> vrev = solve(sir);
    if((int)vrev.size()%2==1) vrev.push_back(255);

    if((int)v.size() <= (int)vrev.size() || 1)
    {
        for(int x:v)
            send(x);
    }
    else
    {
        for(int x:vrev)
            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);
    if(lun%2==1)
    {
        for(int cnt_val=1;;cnt_val++)
        {
            if(cnt_val*lun >= 8*N)
            {
                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;
            }
        }
    }
    else
    {
        assert(0);
    }
}
#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...