Submission #550472

#TimeUsernameProblemLanguageResultExecution timeMemory
550472elazarkorenScales (IOI15_scales)C++17
55.73 / 100
1 ms212 KiB
#include <bits/stdc++.h> #include "scales.h" #define x first #define y second #define all(v) v.begin(), v.end() #define chkmin(a, b) a = min(a, b) #define chkmax(a, b) a = max(a, b) using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vii; mt19937 rng(time(0)); void init(int T) { } map<vi, int> asksLight; int queryLight(int a, int b, int c) { vi v = {a, b, c}; sort(all(v)); if (asksLight.count(v)) return asksLight[v]; return asksLight[v] = getLightest(a, b, c); } map<vi, int> asksHeavy; int queryHeavy(int a, int b, int c) { vi v = {a, b, c}; sort(all(v)); if (asksHeavy.count(v)) return asksHeavy[v]; return asksHeavy[v] = getHeaviest(a, b, c); } map<vi, int> asksMed; int queryMed(int a, int b, int c) { vi v = {a, b, c}; sort(all(v)); if (asksMed.count(v)) return asksMed[v]; return asksMed[v] = getMedian(a, b, c); } map<vi, int> asksNext; int queryNext(int a, int b, int c, int d) { vi v = {a, b, c}; sort(all(v)); v.push_back(d); if (asksNext.count(v)) return asksNext[v]; return asksNext[v] = getNextLightest(a, b, c, d); } void Sort(int i, int j, int k, int *w) { int x = queryLight(w[i], w[j], w[k]); if (x == w[j]) swap(w[i], w[j]); else if (x == w[k]) swap(w[i], w[k]); x = queryMed(w[i], w[j], w[k]); if (x == w[i]) swap(w[j], w[i]); else if (x == w[k]) swap(w[j], w[k]); } vi Solve(vi v, int x, int med, bool b) { vi ans; if (v.size() == 2) { int y = queryMed(v[0], v[1], x); if (y == x) { ans = {v[0], x, v[1]}; } else if (y == v[0]) { ans = {x, v[0], v[1]}; } else { ans = {v[0], v[1], x}; } } else if (v.size() == 1) { int y = queryMed(v[0], x, med); if (y == x && b || y != x && !b) { ans = {x, v[0]}; } else { ans = {v[0], x}; } } else { int y = queryMed(v[0], v[1], x); if (v[0] == y) { ans = {x, v[0], v[1], v[2]}; } else if (x == y) { ans = {v[0], x, v[1], v[2]}; } else { vi t = Solve({v[2]}, x, med, b); ans = {v[0], v[1]}; for (int z : t) ans.push_back(z); } } return ans; } void orderCoins() { int w[] = {1, 2, 3, 4, 5, 6}; shuffle(w, w + 6, rng); asksLight.clear(); asksHeavy.clear(); asksMed.clear(); asksNext.clear(); Sort(0, 1, 2, w); Sort(3, 4, 5, w); int med = w[1]; int x = queryNext(w[3], w[4], w[5], med); vi l, r; if (x != w[3]) { l.push_back(w[3]); if (x == w[4]) r.push_back(w[4]); else l.push_back(w[4]); r.push_back(w[5]); l = Solve(l, w[0], med, 0); r = Solve(r, w[2], med, 1); } else { int y = queryLight(med, w[3], w[4]); if (y == med) { l = {w[0]}; r = Solve({w[3], w[4], w[5]}, w[2], med, 1); } else { l = Solve({w[3], w[4], w[5]}, w[0], med, 0); r = {w[2]}; } } int ind = 0; for (int y : l) { w[ind++] = y; } w[ind++] = med; for (int y : r) { w[ind++] = y; } answer(w); } //1 //3 4 6 2 1 5

Compilation message (stderr)

scales.cpp: In function 'void init(int)':
scales.cpp:17:15: warning: unused parameter 'T' [-Wunused-parameter]
   17 | void init(int T) {
      |           ~~~~^
scales.cpp: In function 'vi Solve(vi, int, int, bool)':
scales.cpp:75:20: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   75 |         if (y == x && b || y != x && !b) {
      |                    ^
#Verdict Execution timeMemoryGrader output
Fetching results...