Submission #1324913

#TimeUsernameProblemLanguageResultExecution timeMemory
1324913shushemojiScales (IOI15_scales)C++20
55.56 / 100
1 ms332 KiB
#ifndef rtgsp
#include "scales.h"
#endif // rtgsp

#include<bits/stdc++.h>
using namespace std;

#ifdef rtgsp
#define _MAXN 6
#define _MAX_ANSWER_CALLS 1

static int _realC[_MAXN];
static int _ind[_MAXN];
static int _numQueries;
static int _numAnswerCalls;

void initialize(int t);
void weigh();

static int _getNumberOfTests() {
    int T, ret;

    std::cin >> T;

    return T;
}

static void _initNewTest() {
    int i, ret;

    for (i = 0; i < _MAXN; i++) {
        // ret = fscanf(_f, "%d", &_realC[i]);
        // assert(ret == 1);
        std::cin >> _realC[i];
        _realC[i]--;
        _ind[_realC[i]] = i;
    }

    _numQueries = 0;
    _numAnswerCalls = 0;
}

void answer(int W[]) {
    int i;

    _numAnswerCalls++;
    if (_numAnswerCalls > _MAX_ANSWER_CALLS)
        return;

    for (i = 0; i < 6; i++)
        // fprintf(_of, "%d ", W[i]);
        std::cout << W[i] << " ";
    // fprintf(_of, "\n%d\n", _numQueries);
    std::cout << "\n";
}

static void _checkQuery(int A, int B, int C, int D) {
    if (D == -1) {
        if (A < 1 || A > 6 || B < 1 || B > 6 || C < 1 || C > 6)
            assert(0);
        if (A == B || B == C || A == C)
            assert(0);
    }
    else {
        if (A < 1 || A > 6 || B < 1 || B > 6 || C < 1 || C > 6 || D < 1 || D > 6)
            assert(0);
        if (A == B || A == C || A == D || B == C || B == D || C == D)
            assert(0);
    }
}

int getMedian(int A, int B, int C) {
    _numQueries++;
    _checkQuery(A, B, C, -1);

    A--; B--; C--;

    if (_ind[B] < _ind[A] && _ind[A] < _ind[C])
        return A + 1;

    if (_ind[C] < _ind[A] && _ind[A] < _ind[B])
        return A + 1;

    if (_ind[A] < _ind[B] && _ind[B] < _ind[C])
        return B + 1;

    if (_ind[C] < _ind[B] && _ind[B] < _ind[A])
        return B + 1;

    return C + 1;
}

int getHeaviest(int A, int B, int C) {
    _numQueries++;
    _checkQuery(A, B, C, -1);

    A--; B--; C--;

    if (_ind[A] > _ind[B] && _ind[A] > _ind[C])
        return A + 1;

    if (_ind[B] > _ind[A] && _ind[B] > _ind[C])
        return B + 1;

    return C + 1;
}

int getLightest(int A, int B, int C) {
    _numQueries++;
    _checkQuery(A, B, C, -1);

    A--; B--; C--;

    if (_ind[A] < _ind[B] && _ind[A] < _ind[C])
        return A + 1;

    if (_ind[B] < _ind[A] && _ind[B] < _ind[C])
        return B + 1;

    return C + 1;
}

int getNextLightest(int A, int B, int C, int D) {
    int allLess = 1;

    _numQueries++;
    _checkQuery(A, B, C, D);

    A--; B--; C--; D--;

    if (_ind[A] > _ind[D] || _ind[B] > _ind[D] || _ind[C] > _ind[D])
        allLess = 0;

    if (allLess == 1) {
        if (_ind[A] < _ind[B] && _ind[A] < _ind[C])
            return A + 1;

        if (_ind[B] < _ind[A] && _ind[B] < _ind[C])
            return B + 1;

        return C + 1;
    }

    if (_ind[A] > _ind[D]) {
        if ((_ind[A] < _ind[B] || _ind[B] < _ind[D]) && (_ind[A] < _ind[C] || _ind[C] < _ind[D]))
            return A + 1;
    }

    if (_ind[B] > _ind[D]) {
        if ((_ind[B] < _ind[A] || _ind[A] < _ind[D]) && (_ind[B] < _ind[C] || _ind[C] < _ind[D]))
            return B + 1;
    }

    return C + 1;
}
#endif // rtgsp

void init (int t)
{
    ;
}

int p[6];

void orderCoins ()
{
    int l = getLightest(1, 2, 3), h = getHeaviest(1, 2, 3);
    p[0] = l; p[1] = l ^ h; p[2] = h;
    /*for (int i = 0; i <= 2; i++) cout << p[i] << " ";
    cout << endl;*/
    int p4 = getMedian(p[0], p[1], 4);
    if (p4 == p[0])
    {
        for (int i = 3; i > 0; i--) p[i] = p[i - 1];
        p[0] = 4;
    }
    else if (p4 == 4)
    {
        for (int i = 3; i > 1; i--) p[i] = p[i - 1];
        p[1] = 4;
    }
    else
    {
        p4 = getMedian(p[1], p[2], 4);
        if (p4 == 4)
        {
            p[3] = p[2];
            p[2] = 4;
        }
        else
        {
            p[3] = 4;
        }
    }
    /*for (int i = 0; i <= 3; i++) cout << p[i] << " ";
    cout << endl;*/
    int p5 = getMedian(p[1], p[2], 5);
    if (p5 == p[1])
    {
        p5 = getMedian(p[0], p[1], 5);
        if (p5 == p[0])
        {
            for (int i = 4; i > 0; i--) p[i] = p[i - 1];
            p[0] = 5;
        }
        else
        {
            for (int i = 4; i > 1; i--) p[i] = p[i - 1];
            p[1] = 5;
        }
    }
    else if (p5 == 5)
    {
        for (int i = 4; i > 2; i--) p[i] = p[i - 1];
        p[2] = 5;
    }
    else
    {
        p5 = getMedian(p[2], p[3], 5);
        if (p5 == 5)
        {
            p[4] = p[3];
            p[3] = 5;
        }
        else
        {
            p[4] = 5;
        }
    }
    /*for (int i = 0; i <= 4; i++) cout << p[i] << " ";
    cout << endl;*/
    int p6 = getMedian(p[1], p[3], 6);
    if (p6 == p[1])
    {
        p6 = getMedian(p[0], p[1], 6);
        if (p6 == p[0])
        {
            for (int i = 5; i > 0; i--) p[i] = p[i - 1];
            p[0] = 6;
        }
        else
        {
            for (int i = 5; i > 1; i--) p[i] = p[i - 1];
            p[1] = 6;
        }
    }
    else if (p6 == 6)
    {
        p6 = getMedian(p[1], p[2], p6);
        if (p6 == 6)
        {
            for (int i = 5; i > 2; i--) p[i] = p[i - 1];
            p[2] = 6;
        }
        else
        {
            for (int i = 5; i > 3; i--) p[i] = p[i - 1];
            p[3] = 6;
        }
    }
    else
    {
        p6 = getMedian(p[3], p[4], 6);
        if (p6 == 6)
        {
            p[5] = p[4];
            p[4] = 6;
        }
        else
        {
            p[5] = 6;
        }
    }
    /*for (int i = 0; i <= 5; i++) cout << p[i] << " ";
    cout << endl;*/
    answer(p);
}

#ifdef rtgsp
int main() {

    int T, i;

    T = _getNumberOfTests();
    init(T);

    for (i = 1; i <= T; i++) {
        _initNewTest();
        orderCoins();
    }

    return 0;
}
#endif //rtgsp
#Verdict Execution timeMemoryGrader output
Fetching results...