제출 #944532

#제출 시각아이디문제언어결과실행 시간메모리
944532LoboScales (IOI15_scales)C++17
71.43 / 100
467 ms804 KiB
#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);
}

컴파일 시 표준 에러 (stderr) 메시지

scales.cpp: In function 'void init(int)':
scales.cpp:12:15: warning: unused parameter 'T' [-Wunused-parameter]
   12 | void init(int T) {
      |           ~~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...