답안 #769399

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
769399 2023-06-29T14:08:26 Z MilosMilutinovic 앵무새 (IOI11_parrots) C++14
100 / 100
1387 ms 104196 KB
#include "encoder.h"
#include "encoderlib.h"
#include <bits/stdc++.h>
using namespace std;

const int C = 160;
const int B = 256;
const int N = 5 * 64;

struct NumBig {
    int d[C];
    void init() { for (int i = 0; i < C; i++) d[i] = 0; }
    NumBig() { init(); }
    void print() {
        for (int i = 0; i < 50; i++) {
            printf("%d ", d[i]);
        }
        printf("\n");
    }
};
NumBig const operator + (NumBig a, NumBig b) {
    NumBig res;
    res.d[C - 1] = -1e9;
    for (int i = 0; i < C; i++) {
        res.d[i] += a.d[i] + b.d[i];
        while (res.d[i] >= 10) {
            res.d[i] -= 10;
            res.d[i + 1] += 1;
        }
    }
    res.d[C - 1] = 0;
    return res;
}
NumBig const operator * (NumBig a, int c) {
    //printf("mnozim sa %d\n", c);
    NumBig res;
    res.d[C - 1] = -1e9;
    for (int i = 0; i < C; i++) {
        res.d[i] += a.d[i] * c;
        while (res.d[i] >= 10) {
            res.d[i] -= 10;
            res.d[i + 1] += 1;
        }
    }
    res.d[C - 1] = 0;
    return res;
}
bool const operator >= (NumBig a, NumBig b) {
    for (int i = C - 1; i >= 0; i--) {
        if (a.d[i] != b.d[i]) {
            return a.d[i] > b.d[i];
        }
    }
    return true;
}
NumBig const operator - (NumBig a, NumBig b) {
    NumBig res;
    for (int i = 0; i < C; i++) {
        res.d[i] = a.d[i] - b.d[i];
        while (res.d[i] < 0) {
            res.d[i] += 10;
            a.d[i + 1] -= 1;
        }
    }
    return res;
}

NumBig pd[N][B];

void dp_make(int n) {
    for (int i = 0; i < B; i++) {
        pd[n - 1][i].init();
        pd[n - 1][i].d[0] = 1;
    }
    for (int i = n - 2; i >= 0; i--) {
        NumBig sum;
        for (int j = B - 1; j >= 0; j--) {
            sum = sum + pd[i + 1][j];
            pd[i][j] = sum;
        }
    }
}

void encode(int N, int M[])
{
    if (pd[N - 1][0].d[0] == 0)
        dp_make(5 * N);
    NumBig val, pw;
    pw.d[0] = 1;
    for (int i = 0; i < N; i++) {
        val = val + (pw * M[i]);
        pw = pw * B;
    }
    NumBig ONE;
    ONE.d[0] = 1;
    val = val + ONE;
    int lst = 0;
    NumBig cur_sum;
    for (int i = 0; i < 5 * N; i++) {
        for (int j = lst; j < B; j++) {
            if (pd[i][j] >= val) {
                lst = j;
                send(lst);
                break;
            }
            val = val - pd[i][j];
        }
    }
}

/*
8
1 0 1 0 0 1 1 0
*/
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>
using namespace std;

const int C = 160;
const int B = 256;
const int N = 5 * 64;

struct BigNum {
    int d[C];
    void init() { for (int i = 0; i < C; i++) d[i] = 0; }
    BigNum() {  init();  }
    void print() {
        for (int i = 0; i < 50; i++) {
            printf("%d ", d[i]);
        }
        printf("\n");
    }
};
BigNum const operator + (BigNum a, BigNum b) {
    BigNum res;
    res.d[C - 1] = -1e9;
    for (int i = 0; i < C; i++) {
        res.d[i] += a.d[i] + b.d[i];
        while (res.d[i] >= 10) {
            res.d[i] -= 10;
            res.d[i + 1] += 1;
        }
    }
    res.d[C - 1] = 0;
    return res;
}
BigNum const operator * (BigNum a, int c) {
//    printf("mnozim sa %d\n", c);
    BigNum res;
    res.d[C - 1] = -1e9;
    for (int i = 0; i < C; i++) {
        res.d[i] += a.d[i] * c;
        while (res.d[i] >= 10) {
            res.d[i] -= 10;
            res.d[i + 1] += 1;
        }
    }
    res.d[C - 1] = 0;
    return res;
}
bool const operator >= (BigNum a, BigNum b) {
    for (int i = C - 1; i >= 0; i--) {
        if (a.d[i] != b.d[i]) {
            return a.d[i] > b.d[i];
        }
    }
    return true;
}
BigNum const operator - (BigNum a, BigNum b) {
    BigNum res;
    for (int i = 0; i < C; i++) {
        res.d[i] = a.d[i] - b.d[i];
        while (res.d[i] < 0) {
            res.d[i] += 10;
            a.d[i + 1] -= 1;
        }
    }
    return res;
}

BigNum dp[N][B];

void make_dp(int n) {
    for (int i = 0; i < B; i++) {
        dp[n - 1][i].init();
        dp[n - 1][i].d[0] = 1;
    }
    for (int i = n - 2; i >= 0; i--) {
        BigNum sum;
        for (int j = B - 1; j >= 0; j--) {
            sum = sum + dp[i + 1][j];
            dp[i][j] = sum;
        }
    }
}

BigNum bpw[N];

void decode(int N, int L, int X[])
{
    sort(X, X + L);
//    printf("got decode seq = ");
//    for (int i = 0; i < L; i++)
//        printf("%d ", X[i]);
//    printf("\n");
    if (dp[L - 1][0].d[0] == 0)
        make_dp(L);
    BigNum val;
    int lst = 0;
    for (int i = 0; i < L; i++) {
        while (lst != X[i]) {
            val = val + dp[i][lst];
            lst += 1;
        }
    }
    bpw[0].d[0] = 1;
    for (int i = 1; i < N; i++) {
        bpw[i] = bpw[i - 1] * B;
    }
//    printf("SEQ VAL = ");
//    val.print();
    vector<int> ans;
    for (int i = N - 1; i >= 0; i--) {
        ans.push_back(0);
        BigNum nm = bpw[i];
        while (val >= nm) {
            ans.back() += 1;
            nm = nm + bpw[i];
        }
        nm = nm - bpw[i];
        val = val - nm;
    }
    reverse(ans.begin(), ans.end());
    for (int x : ans)
        output(x);
//  int i, b;
//  for(i=0; i<L; i++) {
//    b = X[i];
//    output(b);
//  }
}

/*
8
1 0 1 0 0 1 1 0

10
1 1 2 1 2 3 1 7 10 9

*/

# 결과 실행 시간 메모리 Grader output
1 Correct 44 ms 103624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 103796 KB Output is correct
2 Correct 85 ms 103936 KB Output is correct
3 Correct 113 ms 103980 KB Output is correct
4 Correct 109 ms 103956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 71 ms 103976 KB Output is correct
2 Correct 86 ms 103860 KB Output is correct
3 Correct 112 ms 103728 KB Output is correct
4 Correct 113 ms 103888 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 72 ms 103888 KB Output is correct
2 Correct 109 ms 104008 KB Output is correct
3 Correct 135 ms 103832 KB Output is correct
4 Correct 1306 ms 103924 KB Output is correct
5 Correct 1387 ms 104196 KB Output is correct
6 Correct 223 ms 103824 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 111 ms 103824 KB Output is correct - P = 5.000000
2 Correct 221 ms 103912 KB Output is correct - P = 5.000000
3 Correct 217 ms 103972 KB Output is correct - P = 5.000000
4 Correct 363 ms 104012 KB Output is correct - P = 5.000000
5 Correct 443 ms 104000 KB Output is correct - P = 5.000000
6 Correct 472 ms 103976 KB Output is correct - P = 5.000000
7 Correct 510 ms 103940 KB Output is correct - P = 5.000000