# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
550470 | elazarkoren | 저울 (IOI15_scales) | C++17 | 1 ms | 344 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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) {
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
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |