제출 #1333115

#제출 시각아이디문제언어결과실행 시간메모리
1333115QuocSensei앵무새 (IOI11_parrots)C++20
100 / 100
5 ms836 KiB
#include <bits/stdc++.h>

#define ENCODER
// #define DECODER

#define ll long long 
#define el cout << endl
#define bit(mask, i) (((mask) >> (i)) & 1)
#define BIT(n) ((1ll) << (n))
#define ii pair<int, int>
#define fi first 
#define se second

using namespace std;

const int maxn = 64;
const int maxlog = 8;
const int maxa = 256;

void send(int a);
void output(int b);

namespace SUBTASK_1
{
    #ifdef ENCODER
    namespace personA
    {
        void encode(int N, int M[])
        {
            int a = 0;
            for (int i = 0; i < N; i++)
                a += M[i] * BIT(i);
            send(a);
        }
    }
    #endif

    #ifdef DECODER
    namespace personB
    {
        void decode(int N, int L, int X[])
        {
            for (int i = 0; i < N; i++)
                output(bit(X[0], i));
        }
    }
    #endif
}
namespace SUBTASK_2
{
    #ifdef ENCODER
    namespace personA
    {
        void encode(int N, int M[])
        {
            for (int i = 0; i < N; i++)
                send(i * 256 + M[i]);
        }
    }
    #endif

    #ifdef DECODER
    namespace personB
    {
        void decode(int N, int L, int X[])
        {
            vector<ii> pr;
            for (int i = 0; i < L; i++)
                pr.push_back(ii(X[i] / 256, X[i] % 256));
            sort(pr.begin(), pr.end());
            for (int i = 0; i < N; i++)
                output(pr[i].se);
        }
    }
    #endif
}
namespace SUBTASK_34
{
    #ifdef ENCODER
    namespace personA
    {
        void encode(int N, int M[])
        {
            int block_size = maxa / N;
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < maxlog; j++)
                    if (bit(M[i], j))
                        send(i * block_size + j);
            }
        }
    }
    #endif

    #ifdef DECODER
    namespace personB
    {
        void decode(int N, int L, int X[])
        {
            vector<ii> pr;
            int block_size = maxa / N;
            for (int i = 0; i < L; i++)
                pr.push_back(ii(X[i] / block_size, X[i] % block_size));
            sort(pr.begin(), pr.end());
            for (int i = 0, j = 0; i < N; i++)
            {
                int ans = 0;
                for (;j < L && pr[j].fi == i; j++)
                    ans += BIT(pr[j].se);
                output(ans);
            }
        }
    }
    #endif
}
namespace SUBTASK_5
{
    const int maxk = 20;
    const int maxv = 15;

    ll dp[maxk + 10][maxv + 10], sum[maxk + 10];

    void setup()
    {
        memset(sum, 0, sizeof sum);
        memset(dp, 0, sizeof dp);

        sum[0] = 1;
        dp[0][0] = 1;
        for (int i = 1; i <= maxk; i++)
        {
            for (int j = 0; j <= maxv; j++)
            {
                if (i == 1)
                    dp[i][j] = 1;
                else
                {
                    for (int k = j; k <= maxv; k++)
                        dp[i][j] += dp[i - 1][k];
                }
                sum[i] += dp[i][j];
            }
        }
    }
    vector<int> findKth(int len, ll k)
    {
        vector<int> ans;
        for (int i = len; i >= 1; i--)
        {
            for (int j = i == len ? 0 : ans.back(); j <= maxv; j++)
            {
                if (k >= dp[i][j])
                    k -= dp[i][j];
                else
                {
                    ans.push_back(j);
                    break;
                }
            }
        }
        return ans;
    }
    vector<int> findKth(ll k)
    {
        for (int i = 0; i <= maxk; i++)
            if (k >= sum[i])
                k -= sum[i];
            else
                return findKth(i, k);
        return {};
    }
    ll get_rank(vector<int> p)
    {
        int len = p.size();
        ll ans = 0;
        for (int i = 0; i < len; i++)
        {
            ans += sum[i];
            for (int j = i == 0 ? 0 : p[i - 1]; j < p[i]; j++)
                ans += dp[len - i][j];
        }
        return ans;
    }

    #ifdef ENCODER
    namespace personA
    {
        void encode(int N, int M[])
        {
            int block_size = 4;
            int pos_size = 4;

            setup();

            for (int i = 0; i < N; i += block_size)
            {
                ll val = 0;
                for (int j = block_size - 1; j >= 0; j--)
                {
                    int x = i + j < N ? M[i + j] : 0;
                    val = val * maxa + x;
                }
                vector<int> vt = findKth(val);
                // cout << "WANT SEND: " << val, el;
                for (int x : vt)
                    send(i / 4 * BIT(maxlog - pos_size) + x);
            }
        }
    }
    #endif

    #ifdef DECODER
    namespace personB
    {
        void decode(int N, int L, int X[])
        {
            // cerr << "HELLO" << endl;
            int block_size = 4;
            int pos_size = 4;

            setup();

            vector<ii> pr;
            for (int i = 0; i < L; i++)
                pr.push_back(ii(X[i] / BIT(maxlog - pos_size), X[i] % BIT(maxlog - pos_size)));
            sort(pr.begin(), pr.end());
            // for (ii x : pr)
            //     cout << x.fi << ' ' << x.se, el;

            vector<int> ans;

            for (int i = 0, j = 0; i < N; i += block_size)
            {
                vector<int> vt;
                for (; j < L && pr[j].fi == i / 4; j++)
                    vt.push_back(pr[j].se);
                // for (int x : vt)
                //     cout << x << ' ';
                // el;
                ll val = get_rank(vt);
                // cout << val << ' ' << get_rank(vt), el;

                for (int k = 0; k < block_size; k++, val /= maxa)
                    ans.push_back(val % maxa);
            }
            for (int i = 0; i < N; i++)
                output(ans[i]);
        }
    }
    #endif
}

#ifdef ENCODER
void encode(int N, int M[])
{
    SUBTASK_5::personA::encode(N, M);
}
#endif
#ifdef DECODER
void decode(int N, int L, int X[])
{
    SUBTASK_5::personB::decode(N, L, X);
}
#endif
#include <bits/stdc++.h>

// #define ENCODER
#define DECODER

#define ll long long 
#define el cout << endl
#define bit(mask, i) (((mask) >> (i)) & 1)
#define BIT(n) ((1ll) << (n))
#define ii pair<int, int>
#define fi first 
#define se second

using namespace std;

const int maxn = 64;
const int maxlog = 8;
const int maxa = 256;

void send(int a);
void output(int b);

namespace SUBTASK_1
{
    #ifdef ENCODER
    namespace personA
    {
        void encode(int N, int M[])
        {
            int a = 0;
            for (int i = 0; i < N; i++)
                a += M[i] * BIT(i);
            send(a);
        }
    }
    #endif

    #ifdef DECODER
    namespace personB
    {
        void decode(int N, int L, int X[])
        {
            for (int i = 0; i < N; i++)
                output(bit(X[0], i));
        }
    }
    #endif
}
namespace SUBTASK_2
{
    #ifdef ENCODER
    namespace personA
    {
        void encode(int N, int M[])
        {
            for (int i = 0; i < N; i++)
                send(i * 256 + M[i]);
        }
    }
    #endif

    #ifdef DECODER
    namespace personB
    {
        void decode(int N, int L, int X[])
        {
            vector<ii> pr;
            for (int i = 0; i < L; i++)
                pr.push_back(ii(X[i] / 256, X[i] % 256));
            sort(pr.begin(), pr.end());
            for (int i = 0; i < N; i++)
                output(pr[i].se);
        }
    }
    #endif
}
namespace SUBTASK_34
{
    #ifdef ENCODER
    namespace personA
    {
        void encode(int N, int M[])
        {
            int block_size = maxa / N;
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < maxlog; j++)
                    if (bit(M[i], j))
                        send(i * block_size + j);
            }
        }
    }
    #endif

    #ifdef DECODER
    namespace personB
    {
        void decode(int N, int L, int X[])
        {
            vector<ii> pr;
            int block_size = maxa / N;
            for (int i = 0; i < L; i++)
                pr.push_back(ii(X[i] / block_size, X[i] % block_size));
            sort(pr.begin(), pr.end());
            for (int i = 0, j = 0; i < N; i++)
            {
                int ans = 0;
                for (;j < L && pr[j].fi == i; j++)
                    ans += BIT(pr[j].se);
                output(ans);
            }
        }
    }
    #endif
}
namespace SUBTASK_5
{
    const int maxk = 20;
    const int maxv = 15;

    ll dp[maxk + 10][maxv + 10], sum[maxk + 10];

    void setup()
    {
        memset(sum, 0, sizeof sum);
        memset(dp, 0, sizeof dp);

        sum[0] = 1;
        dp[0][0] = 1;
        for (int i = 1; i <= maxk; i++)
        {
            for (int j = 0; j <= maxv; j++)
            {
                if (i == 1)
                    dp[i][j] = 1;
                else
                {
                    for (int k = j; k <= maxv; k++)
                        dp[i][j] += dp[i - 1][k];
                }
                sum[i] += dp[i][j];
            }
        }
    }
    vector<int> findKth(int len, ll k)
    {
        vector<int> ans;
        for (int i = len; i >= 1; i--)
        {
            for (int j = i == len ? 0 : ans.back(); j <= maxv; j++)
            {
                if (k >= dp[i][j])
                    k -= dp[i][j];
                else
                {
                    ans.push_back(j);
                    break;
                }
            }
        }
        return ans;
    }
    vector<int> findKth(ll k)
    {
        for (int i = 0; i <= maxk; i++)
            if (k >= sum[i])
                k -= sum[i];
            else
                return findKth(i, k);
        return {};
    }
    ll get_rank(vector<int> p)
    {
        int len = p.size();
        ll ans = 0;
        for (int i = 0; i < len; i++)
        {
            ans += sum[i];
            for (int j = i == 0 ? 0 : p[i - 1]; j < p[i]; j++)
                ans += dp[len - i][j];
        }
        return ans;
    }

    #ifdef ENCODER
    namespace personA
    {
        void encode(int N, int M[])
        {
            int block_size = 4;
            int pos_size = 4;

            setup();

            for (int i = 0; i < N; i += block_size)
            {
                ll val = 0;
                for (int j = block_size - 1; j >= 0; j--)
                {
                    int x = i + j < N ? M[i + j] : 0;
                    val = val * maxa + x;
                }
                vector<int> vt = findKth(val);
                // cout << "WANT SEND: " << val, el;
                for (int x : vt)
                    send(i / 4 * BIT(maxlog - pos_size) + x);
            }
        }
    }
    #endif

    #ifdef DECODER
    namespace personB
    {
        void decode(int N, int L, int X[])
        {
            // cerr << "HELLO" << endl;
            int block_size = 4;
            int pos_size = 4;

            setup();

            vector<ii> pr;
            for (int i = 0; i < L; i++)
                pr.push_back(ii(X[i] / BIT(maxlog - pos_size), X[i] % BIT(maxlog - pos_size)));
            sort(pr.begin(), pr.end());
            // for (ii x : pr)
            //     cout << x.fi << ' ' << x.se, el;

            vector<int> ans;

            for (int i = 0, j = 0; i < N; i += block_size)
            {
                vector<int> vt;
                for (; j < L && pr[j].fi == i / 4; j++)
                    vt.push_back(pr[j].se);
                // for (int x : vt)
                //     cout << x << ' ';
                // el;
                ll val = get_rank(vt);
                // cout << val << ' ' << get_rank(vt), el;

                for (int k = 0; k < block_size; k++, val /= maxa)
                    ans.push_back(val % maxa);
            }
            for (int i = 0; i < N; i++)
                output(ans[i]);
        }
    }
    #endif
}

#ifdef ENCODER
void encode(int N, int M[])
{
    SUBTASK_5::personA::encode(N, M);
}
#endif
#ifdef DECODER
void decode(int N, int L, int X[])
{
    SUBTASK_5::personB::decode(N, L, X);
}
#endif
#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...