Submission #798305

#TimeUsernameProblemLanguageResultExecution timeMemory
798305khshgParrots (IOI11_parrots)C++14
Compilation error
0 ms0 KiB
#include "encoder.h" #include "encoderlib.h" #include <bits/stdc++.h> using namespace std; const int BASE = 31622; int LEN; struct BIGNUM { vector<int> d; }dp[41 * 64 / 10][256]; BIGNUM add(const BIGNUM& A, const BIGNUM& B) { BIGNUM res; int C = 0; for(int i = 0; i < max((int)A.d.size(), (int)B.d.size()) || C; ++i) { int cur = C; if(i < (int)A.d.size()) cur += A.d[i]; if(i < (int)B.d.size()) cur += B.d[i]; C = cur >= BASE; if(C) cur -= BASE; res.d.push_back(cur); } return res; } BIGNUM sub(const BIGNUM& A, const BIGNUM& B) { int C = 0; for(int i = 0; i < (int)B.d.size() || C; ++i) { A.d[i] -= C + (i < (int)B.d.size() ? B.d[i] : 0); C = A.d[i] < 0; if(C) A.d[i] += BASE; } while((int)A.d.size() && A.d.back() == 0) A.d.pop_back(); return A; } BIGNUM mul(const int& A, const BIGNUM& B) { BIGNUM res; int C = 0; for(int i = 0; i < (int)B.d.size() || C; ++i) { int cur = C; if(i < (int)B.d.size()) cur += A * B.d[i]; C = cur / BASE; res.d.push_back(cur - C * BASE); } while((int)res.d.size() && res.d.back() == 0) res.d.pop_back(); return res; } bool cmp(const BIGNUM& A, const BIGNUM& B) { if((int)A.d.size() != (int)B.d.size()) return (int)A.d.size() < (int)B.d.size(); for(int i = (int)A.d.size() - 1; i >= 0; --i) { if(A.d[i] != B.d[i]) return A.d[i] < B.d[i]; } return 0; } void encode(int N, int M[]) { LEN = 41 * N / 10; for(int i = 0; i < 256; ++i) dp[0][i].d = {1};// ONE for(int i = 1; i < LEN; ++i) dp[i][0].d = {1};// ONE for(int i = 1; i < LEN; ++i) { for(int j = 1; j < 256; ++j) { dp[i][j] = add(dp[i][j - 1], dp[i - 1][j]); } } BIGNUM val, pwi; pwi.d = {1}; for(int i = N - 1; i >= 0; --i) { val = add(val, mul(M[i], pwi)); if(i > 0) pwi = mul(256, pwi); } for(int i = LEN - 1; i >= 0; --i) { int j; for(j = 0; j < 256; ++j) { if(cmp(val, dp[i][j])) { break; } val = sub(val, dp[i][j]); } send(j); } }
#include "decoder.h" #include "decoderlib.h" #include <bits/stdc++.h> using namespace std; const int BASE = 31622; int LEN; struct BIGNUM { vector<int> d; }dp[41 * 64 / 10][256]; BIGNUM add(const BIGNUM& A, const BIGNUM& B) { BIGNUM res; int C = 0; for(int i = 0; i < max((int)A.d.size(), (int)B.d.size()) || C; ++i) { int cur = C; if(i < (int)A.d.size()) cur += A.d[i]; if(i < (int)B.d.size()) cur += B.d[i]; C = cur >= BASE; if(C) cur -= BASE; res.d.push_back(cur); } return res; } BIGNUM sub(BIGNUM A, const BIGNUM& B) { int C = 0; for(int i = 0; i < (int)B.d.size() || C; ++i) { A.d[i] -= C + (i < (int)B.d.size() ? B.d[i] : 0); C = A.d[i] < 0; if(C) A.d[i] += BASE; } while((int)A.d.size() && A.d.back() == 0) A.d.pop_back(); return A; } BIGNUM mul(const int& A, const BIGNUM& B) { BIGNUM res; int C = 0; for(int i = 0; i < (int)B.d.size() || C; ++i) { int cur = C; if(i < (int)B.d.size()) cur += A * B.d[i]; C = cur / BASE; res.d.push_back(cur - C * BASE); } while((int)res.d.size() && res.d.back() == 0) res.d.pop_back(); return res; } bool cmp(const BIGNUM& A, const BIGNUM& B) { if((int)A.d.size() != (int)B.d.size()) return (int)A.d.size() < (int)B.d.size(); for(int i = (int)A.d.size() - 1; i >= 0; --i) { if(A.d[i] != B.d[i]) return A.d[i] < B.d[i]; } return 0; } void decode(int N, int L, int X[]) { LEN = 41 * N / 10; sort(X, X + L); for(int i = 0; i < 256; ++i) dp[0][i].d = {1};// ONE for(int i = 1; i < LEN; ++i) dp[i][0].d = {1};// ONE for(int i = 1; i < LEN; ++i) { for(int j = 1; j < 256; ++j) { dp[i][j] = add(dp[i][j - 1], dp[i - 1][j]); } } BIGNUM val; for(int i = LEN - 1; i >= 0; --i) { for(int j = 0; j < X[i]; ++j) val = add(val, dp[i][j]); } vector<BIGNUM> p(N); p[0].d = {1}; for(int i = 1; i < N; ++i) { p[i] = mul(256, p[i - 1]); } for(int i = N - 1; i >= 0; --i) { int L = 0, R = 255; while(L < R) { int M = (L + R + 1) / 2; if(cmp(val, mul(M, p[i]))) { R = M - 1; } else { L = M; } } output(L); val = sub(val, mul(L, p[i])); } }

Compilation message (stderr)

encoder.cpp: In function 'BIGNUM sub(const BIGNUM&, const BIGNUM&)':
encoder.cpp:30:10: error: assignment of read-only location 'A.BIGNUM::d.std::vector<int>::operator[](((std::vector<int>::size_type)i))'
   30 |   A.d[i] -= C + (i < (int)B.d.size() ? B.d[i] : 0);
encoder.cpp:32:16: error: assignment of read-only location 'A.BIGNUM::d.std::vector<int>::operator[](((std::vector<int>::size_type)i))'
   32 |   if(C) A.d[i] += BASE;
encoder.cpp:34:57: error: passing 'const std::vector<int>' as 'this' argument discards qualifiers [-fpermissive]
   34 |  while((int)A.d.size() && A.d.back() == 0) A.d.pop_back();
      |                                                         ^
In file included from /usr/include/c++/10/vector:67,
                 from /usr/include/c++/10/queue:61,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:86,
                 from encoder.cpp:3:
/usr/include/c++/10/bits/stl_vector.h:1225:7: note:   in call to 'void std::vector<_Tp, _Alloc>::pop_back() [with _Tp = int; _Alloc = std::allocator<int>]'
 1225 |       pop_back() _GLIBCXX_NOEXCEPT
      |       ^~~~~~~~