제출 #515974

#제출 시각아이디문제언어결과실행 시간메모리
515974600Mihnea앵무새 (IOI11_parrots)C++17
17 / 100
10 ms1372 KiB
#pragma once #include "encoder.h" #include "encoderlib.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; void encode(int n, int __message[]) { const ll INF = (ll) 1e18; const int CNT = 20; const int START = 15 + 20; vector<vector<ll>> comb(100, vector<ll> (100, 0)); for (int i = 0; i < 100; i++) { comb[i][0] = 1; for (int j = 1; j <= i; j++) { comb[i][j] = min(INF, comb[i - 1][j] + comb[i - 1][j - 1]); } } function<ll(int)> getvalue = [&] (int i) { if (0 <= i && i < n) { return __message[i]; } return 0; }; function<vector<int>(int, int, ll)> write = [&] (int CNT, int START, ll x) { vector<int> sol; int j = CNT; for (int i = START; i >= 0 && j >= 1; i--) { ll current = comb[i][j]; if (x >= current) { x -= current; /// cout << " = " << START - i - (int) sol.size() << "\n"; sol.push_back(START - i - (int) sol.size()); j--; } } assert((int) sol.size() == CNT); assert(x == 0); return sol; }; for (int l = 0; l < n; l += 4) { ll num = getvalue(l) + getvalue(l + 1) * 256 + getvalue(l + 2) * 256 * 256 + getvalue(l + 3) * 256 * 256 * 256; ///cout << "encoded " << num << "\n"; /// 0, START vector<int> guys = write(CNT, START, num); for (auto &x : guys) { assert(0 <= x && x <= 16); if (x == 16) { continue; } send((l / 4) * 16 + x); } } return; exit(0); }
#pragma once #include "decoder.h" #include "decoderlib.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; void decode(int n, int L, int guys[]) { const ll INF = (ll) 1e18; const int CNT = 20; const int START = 15 + 20; vector<vector<ll>> comb(100, vector<ll> (100, 0)); for (int i = 0; i < 100; i++) { comb[i][0] = 1; for (int j = 1; j <= i; j++) { comb[i][j] = min(INF, comb[i - 1][j] + comb[i - 1][j - 1]); } } function<vector<int>(int, int, ll)> write = [&] (int CNT, int START, ll x) { vector<int> sol; int j = CNT; for (int i = START; i >= 0 && j >= 1; i--) { ll current = comb[i][j]; if (x >= current) { x -= current; sol.push_back(START - i - (int) sol.size()); j--; } } assert((int) sol.size() == CNT); assert(x == 0); return sol; }; sort(guys, guys + L); int top = 0; for (int l = 0; l < n; l += 4) { vector<int> inds; for (int j = 0; j < CNT; j++) { int val; if (top < L && guys[top] / 16 == l / 4) { val = guys[top++] % 16; } else { val = 16; } /// START - i - j = val /// i = START - j - val int i = START - j - val; inds.push_back(i); } sort(inds.begin(), inds.end()); int j = CNT; ll num = 0; for (int i = START; i >= 0 && j >= 1; i--) { ll current = comb[i][j]; assert(!inds.empty()); if (i == inds.back()) { inds.pop_back(); num += current; j--; } } ///cout << "\t\t\t\tdecoded " << num << "\n"; vector<ll> sol; sol.push_back(num % 256), num /= 256; sol.push_back(num % 256), num /= 256; sol.push_back(num % 256), num /= 256; sol.push_back(num % 256), num /= 256; for (auto &x : sol) { // cout << "sol = " << x << "\n"; } //reverse(sol.begin(), sol.end()); for (auto &x : sol) { output(x); } } return; exit(0); }

컴파일 시 표준 에러 (stderr) 메시지

encoder.cpp:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~

decoder.cpp:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
decoder.cpp: In function 'void decode(int, int, int*)':
decoder.cpp:82:16: warning: unused variable 'x' [-Wunused-variable]
   82 |     for (auto &x : sol) {
      |                ^
#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...