Submission #1141201

#TimeUsernameProblemLanguageResultExecution timeMemory
1141201josephtenorioParrots (IOI11_parrots)C++20
100 / 100
9 ms840 KiB
#include "encoder.h" #include "encoderlib.h" #include <bits/stdc++.h> using namespace std; int bits = 4; int emp = 64 / pow(2, 8 - bits); int pn = 5; map<int, map<int, long long>> dp; long long f(int num, int niv) { if (niv == 0) return 1; if (niv == 1 || num == 0) { return num; } if (dp[num][niv] == 0) { dp[num][niv] = f(num, niv - 1) + f(num - 1, niv); } return dp[num][niv]; } void sendcode(long long code, int niv, int pre, vector<pair<long long, long long>> &posi) { for (int t1 = niv; t1 >= 1; t1 --) { for (int t2 = (1<<bits)-1; t2 >= 0; t2 --) { if (code >= f(t2, t1)) { send(pre + t2); code -= f(t2, t1); break ; } } } } void empac(long long code, int pre, vector<pair<long long, long long>> &posi) { for (int niv = 1; niv < posi.size(); niv ++) { if (posi[niv].first <= code && code <= posi[niv].second) { code -= posi[niv].first; sendcode(code, niv, pre << bits, posi); break ; } } } void encode(int n, int m[]) { vector<pair<long long, long long>> posi = {{-1, -1}}; for (int t1 = 1; t1 <= emp*pn; t1 ++) { posi.push_back({f((1<<bits)+1, t1 - 1) - 1, f((1<<bits)+1, t1 - 1) + f((1<<bits), t1) - 2}); } int sup = (1<<(8-bits)) - 1; int index = 0; while (n >= emp) { long long code = 0; for (int t1 = 0; t1 < emp; t1 ++) { code <<= 8; code += m[index]; index ++; } empac(code, sup, posi); n -= emp; sup --; } if (n != 0) { long long code = 0; for (int t1 = 0; t1 < n; t1 ++) { code <<= 8; code += m[index]; index ++; } empac(code, sup, posi); sup --; } return ; }
#include "decoder.h" #include "decoderlib.h" #include <bits/stdc++.h> using namespace std; int bits = 4; int emp = 64 / pow(2, 8 - bits); int pn = 5; map<int, map<int, long long>> dp; long long f(int num, int niv) { if (niv == 0) return 1; if (niv == 1 || num == 0) { return num; } if (dp[num][niv] == 0) { dp[num][niv] = f(num, niv - 1) + f(num - 1, niv); } return dp[num][niv]; } long long decod(vector<int> nums) { long long sum = 0; sort(nums.begin(), nums.end()); for (int t1 = 0; t1 < nums.size(); t1 ++) { sum += f(nums[t1], t1+1); } return sum; } void decode(int n, int t, int cod[]) { vector<pair<long long, long long>> posi = {{-1, -1}}; vector<int> ns(t); for (int t1 = 1; t1 <= emp*pn; t1 ++) { posi.push_back({f((1<<bits) + 1, t1 - 1) - 1, f((1<<bits) + 1, t1 - 1) + f((1<<bits), t1) - 2}); } for (int t1 = 0; t1 < t; t1++) { ns[t1] = cod[t1]; } sort(ns.rbegin(), ns.rend()); int sup = (1<<(8-bits)) - 1; int index = 0; while (n >= emp) { long long code = 0; vector<int> nums; while (index < t && sup == (ns[index] >> bits)) { nums.push_back(ns[index] % (1<<bits)); index ++; } code = decod(nums) + posi[nums.size()].first; n -= emp; sup --; vector<int> ax1; ax1.clear(); for (int t1 = emp; t1 > 0; t1 --) { ax1.push_back(code % 256); code >>= 8; } for (int t1 = ax1.size() -1; t1 >= 0; t1 --) { output(ax1[t1]); } } if (n != 0) { long long code = 0; vector<int> nums; while (index < t && sup == (ns[index] >> bits)) { nums.push_back(ns[index] % (1<<bits)); index ++; } code = decod(nums) + posi[nums.size()].first; vector<int> ax1; for (int t1 = n; t1 > 0; t1 --) { ax1.push_back(code % 256); code >>= 8; } for (int t1 = ax1.size() -1; t1 >= 0; t1 --) { output(ax1[t1]); } } }
#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...