제출 #1329737

#제출 시각아이디문제언어결과실행 시간메모리
1329737SulA앵무새 (IOI11_parrots)C++20
100 / 100
1543 ms18404 KiB
#include "encoder.h"
#include "encoderlib.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<typename T> using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

const int L = 100;

struct number {
    unsigned char dig[L]; // base 256
    // value is sum of dig[i] * 256 ^ i

    number() {
        for (int i = 0; i < L; i++) {
            dig[i] = 0;
        }
    }

    number(int n, int* digs) {
        for (int i = 0; i < n; i++) {
            dig[i] = digs[i];
        }
        for (int i = n; i < L; i++) {
            dig[i] = 0;
        }
    }

    unsigned char& operator[] (int pos) {
        return dig[pos];
    }

    friend number operator+ (number& A, number& B) {
        number res;
        int carry = 0;
        for (int i = 0; i < L; i++) {
            res[i] = ((int)A[i] + B[i] + carry) & 255;
            carry  = ((int)A[i] + B[i] + carry) >> 8;
        }
        return res;
    }

    friend int operator<=> (number& A, number& B) {
        for (int i = L-1; i >= 0; i--) {
            if (A[i] != B[i]) {
                return A[i] < B[i] ? -1 : 1;
            }
        }
        return 0;
    }

    friend bool operator< (number A, number B) {
        return A <=> B <= -1;
    }

    friend bool operator<= (number& A, number& B) {
        return A <=> B <= 0;
    }

    friend bool operator> (number& A, number& B) {
        return 1 <= A <=> B;
    }

    friend bool operator>= (number& A, number& B) {
        return 0 <= A <=> B;
    }
};

const int N = 700;
number dp[N][256];
int one[1];

void init() {
    one[0] = 1;
    for (int len = 1; len < N; len++) {
        dp[len][0] = number(1, one);
        for (int x = 1; x < 256; x++) {
            dp[len][x] = dp[len][x-1] + dp[len-1][x];
        }
    }
}

void encode(int n, int* M) {
    init();
    number message = number(n, M);
    // for (int i = 0; i < L; i++) cout << (int)message[i] << " "; cout << "\n";
    vector<int> kokos;
    number minus;

    for (int len = 5*n + 1, final = 255; len > 1;) {
        if (final == 0) {
            len--;
            kokos.push_back(0);
            continue;
        }
        if (message < minus + dp[len][final - 1]) {
            final--;
        } else {
            minus = minus + dp[len][final - 1];
            len--;
            kokos.push_back(final);
        }
    }
    for (int x : kokos) {
        // cout << x << " ";
        send(x);
    }
}
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<typename T> using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

const int L = 100;

struct number {
    unsigned char dig[L]; // base 256
    // value is sum of dig[i] * 256 ^ i

    number() {
        for (int i = 0; i < L; i++) {
            dig[i] = 0;
        }
    }

    number(int n, int* digs) {
        for (int i = 0; i < n; i++) {
            dig[i] = digs[i];
        }
        for (int i = n; i < L; i++) {
            dig[i] = 0;
        }
    }

    unsigned char& operator[] (int pos) {
        return dig[pos];
    }

    friend number operator+ (number& A, number& B) {
        number res;
        int carry = 0;
        for (int i = 0; i < L; i++) {
            res[i] = ((int)A[i] + B[i] + carry) & 255;
            carry  = ((int)A[i] + B[i] + carry) >> 8;
        }
        return res;
    }

    friend int operator<=> (number& A, number& B) {
        for (int i = L-1; i >= 0; i--) {
            if (A[i] != B[i]) {
                return A[i] < B[i] ? -1 : 1;
            }
        }
        return 0;
    }

    friend bool operator< (number A, number B) {
        return A <=> B <= -1;
    }

    friend bool operator<= (number& A, number& B) {
        return A <=> B <= 0;
    }

    friend bool operator> (number& A, number& B) {
        return 1 <= A <=> B;
    }

    friend bool operator>= (number& A, number& B) {
        return 0 <= A <=> B;
    }
};

const int N = 700;
number dp[N][256];
int one[1];

void init() {
    one[0] = 1;
    for (int len = 1; len < N; len++) {
        dp[len][0] = number(1, one);
        for (int x = 1; x < 256; x++) {
            dp[len][x] = dp[len][x-1] + dp[len-1][x];
        }
    }
}

void decode(int n, int m, int* X) {
    init();
    sort(X, X + m, greater<>());
    number res;
    for (int i = 0, len = 5*n+1; i < m; i++, len--) {
        if (X[i] > 0) {
            res = res + dp[len][X[i] - 1];
        }
    }
    for (int i = 0; i < n; i++) output(res[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...