Submission #1218695

#TimeUsernameProblemLanguageResultExecution timeMemory
1218695viduxScales (IOI15_scales)C++17
55.56 / 100
1 ms328 KiB
#include "scales.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef vector<ll> vl; const ll LLINF = 1e18; void init(int T) { } void orderCoins() { int a1[3], a2[3]; { set<int> s = {1, 2, 3, 4, 5, 6}; a1[0] = getLightest(1, 2, 3); a2[0] = getLightest(4, 5, 6); a1[1] = getMedian(1, 2, 3); a2[1] = getMedian(4, 5, 6); s.erase(a1[0]); s.erase(a2[0]); s.erase(a1[1]); s.erase(a2[1]); a1[2] = *s.begin(); a2[2] = *s.rbegin(); } int ans[6] = {0}; set<int> s1 = {1, 2, 3}, s2 = {4, 5, 6}; { int midMn = getMedian(a1[0], a1[1], a2[0]); if (midMn == a1[0]) { ans[0] = a2[0]; s2.erase(a2[0]); } if (midMn == a1[1]) { ans[0] = a1[0]; ans[1] = a1[1]; s1.erase(a1[0]); s1.erase(a1[1]); } if (midMn == a2[0]) { ans[0] = a1[0]; ans[1] = a2[0]; s1.erase(a1[0]); s2.erase(a2[0]); } } { int midMn = getMedian(a1[2], a2[1], a2[2]); if (midMn == a2[2]) { ans[5] = a1[2]; s1.erase(a1[2]); } if (midMn == a2[1]) { ans[5] = a2[2]; ans[4] = a2[1]; s2.erase(a2[2]); s2.erase(a2[1]); } if (midMn == a1[2]) { ans[5] = a2[2]; ans[4] = a1[2]; s2.erase(a2[2]); s1.erase(a1[2]); } } if (s1.size() > s2.size()) { swap(s1, s2); swap(a1, a2); } if ((int)s1.size() == 2 && (int)s2.size() == 2) { vector<int> miss1, miss2; for (int i = 0; i < 3; i++) { if (s1.count(a1[i])) miss1.push_back(a1[i]); if (s2.count(a2[i])) miss2.push_back(a2[i]); } int mn = getLightest(miss1[0], miss2[0], miss1[1]); for (int i = 0; i < 6; i++) if (!ans[i]) { ans[i] = mn; break; } s1.erase(mn); s2.erase(mn); } if (s1.size() > s2.size()) { swap(s1, s2); swap(a1, a2); } if ((int)s1.size() == 1 && (int)s2.size() == 2) { vector<int> a, b; for (int i = 0; i < 3; i++) { if (s1.count(a1[i])) a.push_back(a1[i]); if (s2.count(a2[i])) b.push_back(a2[i]); } vector<int> ord(3); int midMn = getMedian(a[0], b[0], b[1]); if (midMn == a[0]) { ord[0] = b[0]; ord[1] = a[0]; ord[2] = b[1]; } if (midMn == b[0]) { ord[0] = a[0]; ord[1] = b[0]; ord[2] = b[1]; } if (midMn == b[1]) { ord[0] = b[0]; ord[1] = b[1]; ord[2] = a[0]; } s1.erase(a[0]); s2.erase(b[0]); s2.erase(b[1]); reverse(ord.begin(), ord.end()); for (int i = 0; i < 6; i++) if (!ans[i]) { ans[i] = ord.back(); ord.pop_back(); } } if ((int)s1.size() == 1 && (int)s2.size() == 1) { int mn = getLightest(*s1.begin(), *s2.begin(), ans[5]); vector<int> ord; if (mn == *s1.begin()) ord = {*s1.begin(), *s2.begin()}; else ord = {*s2.begin(), *s1.begin()}; reverse(ord.begin(), ord.end()); for (int i = 0; i < 6; i++) if (!ans[i]) { ans[i] = ord.back(); ord.pop_back(); } } if ((int)s1.size() == 0) { vector<int> missing; for (int i = 0; i < 3; i++) if (s2.count(a2[i])) missing.push_back(a2[i]); reverse(missing.begin(), missing.end()); for (int i = 0; i < 6; i++) { if (!ans[i]) { ans[i] = missing.back(); missing.pop_back(); } } } //for (int i = 0; i < 6; i++) cout << ans[i] << " "; cout << endl; answer(ans); }
#Verdict Execution timeMemoryGrader output
Fetching results...