# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
45736 | jun6873 | Scales (IOI15_scales) | C++11 | 109 ms | 1532 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "scales.h"
#include <bits/stdc++.h>
using namespace std;
int p[720][7] = {{0, 1, 2, 3, 4, 5, 6}};
struct query {
query() {}
query(int t, int a, int b, int c, int d) : t(t), a(a), b(b), c(c), d(d) {}
int t, a, b, c, d;
int moi(int k) {
if (t==1) { // Heaviest
if (p[k][a] > p[k][b] and p[k][a] > p[k][c]) return 0;
else return (p[k][b] > p[k][c]) ? 1 : 2;
} if (t==2) { // Lightest
if (p[k][a] < p[k][b] and p[k][a] < p[k][c]) return 0;
else return (p[k][b] < p[k][c]) ? 1 : 2;
} if (t==3) { // Median
if (p[k][a] < p[k][b]) {
if (p[k][b] < p[k][c]) return 1;
else return p[k][a] < p[k][c] ? 2 : 0;
} else {
if (p[k][a] < p[k][c]) return 0;
else return p[k][b] < p[k][c] ? 2 : 1;
}
} if (t==4) { // NextHeaviest
int x = p[k][a], y = p[k][b], z = p[k][c];
if (not (x < p[k][d] and y < p[k][d] and z < p[k][d])) {
if (x < p[k][d]) x = 7;
if (y < p[k][d]) y = 7;
if (z < p[k][d]) z = 7;
}
if (x<y and x<z) return 0;
else return y<z ? 1 : 2;
} return -1;
}
int real() {
int res;
if (t==1) res = getHeaviest(a, b, c);
if (t==2) res = getLightest(a, b, c);
if (t==3) res = getMedian(a, b, c);
if (t==4) res = getNextLightest(a, b, c, d);
if (res == a) return 0;
if (res == b) return 1;
if (res == c) return 2;
}
};
vector<query> q;
struct node {
query q;
node *ch[3];
set<int> s;
} *root;
bool make_tree(node* k, set<int> s) {
k->s = s;
for (int i=0; i<3; i++) if (!k->ch[i]) k->ch[i] = new node();
if (s.size() <= 1) return true;
for (int i=0; i<q.size(); i++) {
set<int> r[3];
for (int e : s) r[q[i].moi(e)].insert(e);
if (max({r[0].size(), r[1].size(), r[2].size()}) - min({r[0].size(), r[1].size(), r[2].size()}) < 2)
if (make_tree(k->ch[0], r[0]) and make_tree(k->ch[1], r[1]) and make_tree(k->ch[2], r[2])) {
k->q = q[i];
return true;
}
} return false;
}
void init(int T) {
for (int x=1; x<=6; x++) for (int y=x+1; y<=6; y++) for (int z=y+1; z<=6; z++) {
q.emplace_back(1, x, y, z, -1);
q.emplace_back(2, x, y, z, -1);
q.emplace_back(3, x, y, z, -1);
for (int w=1; w<=6; w++) if (x!=w and y!=w and z!=w) q.emplace_back(4, x, y, z, w);
}
for (int i=1; i<720; i++) {
copy(p[i-1]+1, p[i-1]+7, p[i]+1);
next_permutation(p[i]+1, p[i]+7);
}
set<int> st;
for (int i=0; i<720; i++) st.insert(i);
root = new node();
make_tree(root, st);
}
void orderCoins() {
while (root->s.size() > 1) {
root = root->ch[root->q.real()];
}
int ans[6], *rans = p[*root->s.begin()];
for (int i=1; i<=6; i++) ans[rans[i]-1] = i;
answer(ans);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |