제출 #149873

#제출 시각아이디문제언어결과실행 시간메모리
149873USA1 (#200)포도주 시음 (FXCUP4_wine)C++17
65 / 100
12 ms1028 KiB
#include "taster.h" #include "bartender.h" #include <bits/stdc++.h> namespace { using namespace std; using big = __int128_t; const int FOUR = 5; const int THREE = 5; const int TWELVE = 10; big ep(int n, vector<int> perm){ assert((int)perm.size() == n); big res = 0; for(int i = 0; i < n; i++){ res *= (n - i); res += perm[i]; for(int j = i+1; j < n; j++){ if(perm[j] > perm[i]) perm[j] -= 1; } } return res; } vector<int> dp(int n, big val){ vector<int> perm(n, 0); for(int i = n-1; i >= 0; i--){ int ind = val % (n - i); val /= (n - i); perm[i] = ind; for(int j = i + 1; j < n; j++){ if(perm[j] >= perm[i]) perm[j] += 1; } } return perm; } vector<int> encode_permutation(vector<int> perm, int fours, int threes){ big a = 1; for(int i = 1; i <= fours; i++) a *= big(i); big c = 1; for(int i = 0; i < fours; i++) c *= FOUR; for(int i = 0; i < threes; i++) c *= THREE; assert(a <= c); assert(dp(fours, ep(fours, perm)) == perm); big val = ep(fours, perm); vector<int> z; for(int i = 0; i < threes; i++){ z.push_back(int(val % THREE)); val /= THREE; } for(int i = 0; i < fours; i++){ z.push_back(int(val % FOUR)); val /= FOUR; } assert(val == 0); reverse(z.begin(), z.end()); return z; } vector<int> decode_permutation(vector<int> info, int fours, int threes){ int n = (int)info.size(); assert(n == fours + threes); big r = 0; for(int i = 0; i < fours; i++) r = r * FOUR + info[i]; for(int i = 0; i < threes; i++) r = r * THREE + info[fours + i]; vector<int> perm = dp(fours, r); assert(ep(fours, perm) == r); return perm; } vector<int> blendwines(int k, vector<int> r){ for(int& x : r) x -= 1; int n = (int)r.size(); int num_big = min(TWELVE, n); // num_big int num_small = n - num_big; vector<int> small_perm; for(int a : r){ if(a < num_small) small_perm.push_back(a); } assert((int)small_perm.size() == num_small); vector<int> info = encode_permutation(small_perm, num_small, num_big); assert(decode_permutation(info, num_small, num_big) == small_perm); int j = 0; vector<int> a(n); for(int i = 0; i < n; i++){ if(r[i] < num_small){ a[i] = THREE + 1 + info[j]; j += 1; } } for(int i = 0; i < n; i++){ if(r[i] >= num_small){ a[i] = 1 + info[j]; j += 1; } } return a; } vector<int> merge_sort(vector<int> x){ if(x.size() <= 1) return x; vector<int> a, b; int n = (int)x.size(); for(int i = 0; i < n/2; i++) a.push_back(x[i]); for(int i = n/2; i < n; i++) b.push_back(x[i]); a = merge_sort(a); b = merge_sort(b); int i = 0; int j = 0; vector<int> res; while(i < (int)a.size() && j < (int)b.size()){ if(Compare(a[i], b[j]) == -1){ res.push_back(a[i]); i += 1; } else { res.push_back(b[j]); j += 1; } } for(int k = i; k < (int)a.size(); k++) res.push_back(a[k]); for(int k = j; k < (int)b.size(); k++) res.push_back(b[k]); return res; } vector<int> sortwines(int k, vector<int> a) { int n = (int)a.size(); int num_big = min(TWELVE, n); // num_big int num_small = n - num_big; vector<int> info; for(int i = 0; i < n; i++) if(a[i] > THREE) info.push_back(a[i] - THREE - 1); assert((int)info.size() == num_small); for(int i = 0; i < n; i++) if(a[i] <= THREE) info.push_back(a[i] - 1); assert((int)info.size() == n); vector<int> perm = decode_permutation(info, num_small, num_big); assert(encode_permutation(perm, num_small, num_big) == info); int j = 0; vector<int> r(n, -1); vector<int> unknowns; for(int i = 0; i < n; i++){ if(a[i] > THREE){ r[i] = perm[j]; j += 1; } else { unknowns.push_back(i); } } assert((int)unknowns.size() == num_big); mt19937 mt(48); shuffle(unknowns.begin(), unknowns.end(), mt); unknowns = merge_sort(unknowns); for(int i = 0; i < (int)unknowns.size(); i++){ r[unknowns[i]] = i + num_small; } for(int& x : r) x += 1; return r; } } vector<int> BlendWines(int k, vector<int> r){ return blendwines(k, r); }
#include "taster.h" #include "bartender.h" #include <bits/stdc++.h> namespace { using namespace std; using big = __int128_t; const int FOUR = 5; const int THREE = 5; const int TWELVE = 10; big ep(int n, vector<int> perm){ assert((int)perm.size() == n); big res = 0; for(int i = 0; i < n; i++){ res *= (n - i); res += perm[i]; for(int j = i+1; j < n; j++){ if(perm[j] > perm[i]) perm[j] -= 1; } } return res; } vector<int> dp(int n, big val){ vector<int> perm(n, 0); for(int i = n-1; i >= 0; i--){ int ind = val % (n - i); val /= (n - i); perm[i] = ind; for(int j = i + 1; j < n; j++){ if(perm[j] >= perm[i]) perm[j] += 1; } } return perm; } vector<int> encode_permutation(vector<int> perm, int fours, int threes){ big a = 1; for(int i = 1; i <= fours; i++) a *= big(i); big c = 1; for(int i = 0; i < fours; i++) c *= FOUR; for(int i = 0; i < threes; i++) c *= THREE; assert(a <= c); assert(dp(fours, ep(fours, perm)) == perm); big val = ep(fours, perm); vector<int> z; for(int i = 0; i < threes; i++){ z.push_back(int(val % THREE)); val /= THREE; } for(int i = 0; i < fours; i++){ z.push_back(int(val % FOUR)); val /= FOUR; } assert(val == 0); reverse(z.begin(), z.end()); return z; } vector<int> decode_permutation(vector<int> info, int fours, int threes){ int n = (int)info.size(); assert(n == fours + threes); big r = 0; for(int i = 0; i < fours; i++) r = r * FOUR + info[i]; for(int i = 0; i < threes; i++) r = r * THREE + info[fours + i]; vector<int> perm = dp(fours, r); assert(ep(fours, perm) == r); return perm; } vector<int> blendwines(int k, vector<int> r){ for(int& x : r) x -= 1; int n = (int)r.size(); int num_big = min(TWELVE, n); // num_big int num_small = n - num_big; vector<int> small_perm; for(int a : r){ if(a < num_small) small_perm.push_back(a); } assert((int)small_perm.size() == num_small); vector<int> info = encode_permutation(small_perm, num_small, num_big); assert(decode_permutation(info, num_small, num_big) == small_perm); int j = 0; vector<int> a(n); for(int i = 0; i < n; i++){ if(r[i] < num_small){ a[i] = THREE + 1 + info[j]; j += 1; } } for(int i = 0; i < n; i++){ if(r[i] >= num_small){ a[i] = 1 + info[j]; j += 1; } } return a; } vector<int> merge_sort(vector<int> x){ if(x.size() <= 1) return x; vector<int> a, b; int n = (int)x.size(); for(int i = 0; i < n/2; i++) a.push_back(x[i]); for(int i = n/2; i < n; i++) b.push_back(x[i]); a = merge_sort(a); b = merge_sort(b); int i = 0; int j = 0; vector<int> res; while(i < (int)a.size() && j < (int)b.size()){ if(Compare(a[i], b[j]) == -1){ res.push_back(a[i]); i += 1; } else { res.push_back(b[j]); j += 1; } } for(int k = i; k < (int)a.size(); k++) res.push_back(a[k]); for(int k = j; k < (int)b.size(); k++) res.push_back(b[k]); return res; } vector<int> sortwines(int k, vector<int> a) { int n = (int)a.size(); int num_big = min(TWELVE, n); // num_big int num_small = n - num_big; vector<int> info; for(int i = 0; i < n; i++) if(a[i] > THREE) info.push_back(a[i] - THREE - 1); assert((int)info.size() == num_small); for(int i = 0; i < n; i++) if(a[i] <= THREE) info.push_back(a[i] - 1); assert((int)info.size() == n); vector<int> perm = decode_permutation(info, num_small, num_big); assert(encode_permutation(perm, num_small, num_big) == info); int j = 0; vector<int> r(n, -1); vector<int> unknowns; for(int i = 0; i < n; i++){ if(a[i] > THREE){ r[i] = perm[j]; j += 1; } else { unknowns.push_back(i); } } assert((int)unknowns.size() == num_big); mt19937 mt(48); shuffle(unknowns.begin(), unknowns.end(), mt); unknowns = merge_sort(unknowns); for(int i = 0; i < (int)unknowns.size(); i++){ r[unknowns[i]] = i + num_small; } for(int& x : r) x += 1; return r; } } vector<int> SortWines(int k, vector<int> r){ return sortwines(k, r); }

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

bartender.cpp:133:13: warning: 'std::vector<int> {anonymous}::sortwines(int, std::vector<int>)' defined but not used [-Wunused-function]
 vector<int> sortwines(int k, vector<int> a) {
             ^~~~~~~~~

taster.cpp:77:13: warning: 'std::vector<int> {anonymous}::blendwines(int, std::vector<int>)' defined but not used [-Wunused-function]
 vector<int> blendwines(int k, vector<int> r){
             ^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...