Submission #1332773

#TimeUsernameProblemLanguageResultExecution timeMemory
1332773SulAScales (IOI15_scales)C++20
56.25 / 100
7 ms608 KiB
#include "scales.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<typename T> using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

random_device rd;
mt19937 f(rd());

void init(int t) {}

int hypothetic(const vector<int>& coins, vector<int> qu) { // let's say, hypothetically for the sake of argument, ...
    bool lock_in = false;
    int cnt = 0;
    for (int x : coins) {
        if (x == qu[0] || x == qu[1] || x == qu[2]) {
            int pos = x == qu[0] ? 0 : x == qu[1] ? 1 : 2;
            if (lock_in) return pos;
            cnt++;
            if (cnt == -qu[3])
                return pos;
        }
        if (x == qu[3])
            lock_in = true;
    }
    for (int x : coins) {
        if (x == qu[0] || x == qu[1] || x == qu[2]) {
            int pos = x == qu[0] ? 0 : x == qu[1] ? 1 : 2;
            return pos;
        }
    }
    return 0;
}

array<vector<vector<int>>, 3> categorize(vector<vector<int>> cand, vector<int> query) {
    array<vector<vector<int>>, 3> cat;
    for (auto coins : cand) {
        cat[hypothetic(coins, query)].push_back(coins);
    }
    return cat;
}

int make_query(vector<int> qu) {
    int res =
            qu[3] == -1 ? getLightest(qu[0], qu[1], qu[2]) :
            qu[3] == -2 ? getMedian(qu[0], qu[1], qu[2]) :
            qu[3] == -3 ? getHeaviest(qu[0], qu[1], qu[2]) :
            getNextLightest(qu[0], qu[1], qu[2], qu[3]);
    return res == qu[0] ? 0 : res == qu[1] ? 1 : 2;
}

void orderCoins() {
    vector<vector<int>> queries;
    for (int a = 1; a <= 6; a++) {
        for (int b = 1; b <= 6; b++) {
            for (int c = 1; c <= 6; c++) {
                if (set<int>{a, b, c}.size() == 3) {
                    for (int r = -3; r <= -1; r++)
                        queries.push_back({a, b, c, r});
                    for (int d = 1; d <= 6; d++) {
                        if (a == d || b == d || c == d) continue;
                        queries.push_back({a, b, c, d});
                    }
                }
            }
        }
    }
    shuffle(queries.begin(), queries.end(), f);
    vector<vector<int>> cand;
    vector<int> coins = {1, 2, 3, 4, 5, 6};
    do {
        cand.push_back(coins);
    } while (next_permutation(coins.begin(), coins.end()));
    while (cand.size() > 1) {
        int n = cand.size();
        for (auto qu : queries) {
            auto cat = categorize(cand, qu);
            int A = cat[0].size();
            int B = cat[1].size();
            int C = cat[2].size();
            assert(A + B + C == n);
            if (max({A, B, C}) <= min(n-1, (n+4)/5*2)) {
                int x = make_query(qu);
                cand = cat[x];
                break;
            }
        }
    }
    int ans[6];
    for (int i = 0;i < 6; i++)
    ans[i] = cand[0][i];
    answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...