# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
944532 | Lobo | Scales (IOI15_scales) | C++17 | 467 ms | 804 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;
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()
const int maxn = -1;
vector<vector<int>> allp, queries;
void init(int T) {
vector<int> p = {0,1,2,3,4,5,6};
while(p[0] == 0) {
allp.pb(p);
next_permutation(all(p));
}
for(int a = 1; a <= 6; a++) {
for(int b = a+1; b <= 6; b++) {
for(int c = b+1; c <= 6; c++) {
queries.pb(vector<int>{0,a,b,c});
queries.pb(vector<int>{1,a,b,c});
queries.pb(vector<int>{2,a,b,c});
for(int d = 1; d <= 6; d++) {
if(d == a or d == b or d == c) continue;
queries.pb(vector<int>{3,a,b,c,d});
}
}
}
}
/* ... */
}
// 0 L
// 1 M
// 2 H
// 3 S
// ABC(3->D)
// resp
vector<vector<int>> postot(vector<vector<int>> &disp, vector<vector<int>> qrs) {
vector<vector<int>> ansp;
for(auto p : disp) {
bool ok = true;
for(auto vec : qrs) {
int tp = vec[0];
int res = vec.back();
if(tp == 0) {
int a = vec[1];
int b = vec[2];
int c = vec[3];
if(min({p[a],p[b],p[c]}) != p[res]) {
ok = false;
break;
}
}
else if(tp == 1) {
int a = vec[1];
int b = vec[2];
int c = vec[3];
if(p[a]+p[b]+p[c] - min({p[a],p[b],p[c]}) - max({p[a],p[b],p[c]}) != p[res]) {
ok = false;
break;
}
}
else if(tp == 2) {
int a = vec[1];
int b = vec[2];
int c = vec[3];
if(max({p[a],p[b],p[c]}) != p[res]) {
ok = false;
break;
}
}
else if(tp == 3) {
int a = vec[1];
int b = vec[2];
int c = vec[3];
int d = vec[4];
if(p[d] > max({p[a],p[b],p[c]})) {
if(p[res] != min({p[a],p[b],p[c]})) {
ok = false;
break;
}
}
else {
int anshere = 7;
if(p[a] > p[d]) anshere = min(anshere,p[a]);
if(p[b] > p[d]) anshere = min(anshere,p[b]);
if(p[c] > p[d]) anshere = min(anshere,p[c]);
if(anshere != p[res]) {
ok = false;
break;
}
}
}
}
if(ok) {
ansp.pb(p);
}
}
return ansp;
}
void orderCoins() {
vector<vector<int>> qrsofar;
vector<vector<int>> perms = allp;
while(true) {
pair<int,vector<int>> mnqr;
mnqr.fr = 800;
for(auto qr : queries) {
qrsofar.pb(qr);
qrsofar.back().pb(0);
int mx = 0;
qrsofar.back().back() = qr[1];
mx = max(mx,(int) postot(perms,qrsofar).size());
qrsofar.back().back() = qr[2];
mx = max(mx,(int) postot(perms,qrsofar).size());
qrsofar.back().back() = qr[3];
mx = max(mx,(int) postot(perms,qrsofar).size());
qrsofar.pop_back();
mnqr = min(mnqr,mp(mx,qr));
}
// cout << " " << mnqr.fr << endl;
auto qr = mnqr.sc;
if(qr[0] == 0) {
qr.pb(getLightest(qr[1],qr[2],qr[3]));
}
if(qr[0] == 1) {
qr.pb(getMedian(qr[1],qr[2],qr[3]));
}
if(qr[0] == 2) {
qr.pb(getHeaviest(qr[1],qr[2],qr[3]));
}
if(qr[0] == 3) {
qr.pb(getNextLightest(qr[1],qr[2],qr[3],qr[4]));
}
// for(auto x : qr) cout << x << endl;
// cout << endl;
// cout << mnqr.fr << endl;
qrsofar.pb(qr);
// cout << " " << postot(perms,qrsofar).size() << endl;
// auto p = postot(perms,qrsofar)[0];
// for(int i = 1; i <= 6; i++) cout << p[i] << " "; cout << endl;
// p = postot(perms,qrsofar)[1];
// for(int i = 1; i <= 6; i++) cout << p[i] << " "; cout << endl;
// break;
perms = postot(perms,qrsofar);
if(perms.size() == 1) break;
}
auto p = postot(perms,qrsofar)[0];
vector<int> pos(7);
for(int i = 1; i <= 6; i++) pos[p[i]] = i;
auto ansvec = pos;
int ANS[] = {ansvec[1],ansvec[2],ansvec[3],ansvec[4],ansvec[5],ansvec[6]};
answer(ANS);
// /* ... */
// int W[] = {1, 2, 3, 4, 5, 6};
// answer(W);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |