제출 #1209059

#제출 시각아이디문제언어결과실행 시간메모리
1209059jasonic코알라 (APIO17_koala)C++20
47 / 100
35 ms464 KiB
#include "koala.h"
#include <bits/stdc++.h>

using namespace std;

const int MXN = 100;
int toSend[MXN];
int response[MXN];

int minValue(int n, int w) {

    toSend[0] = 1;

    playRound(toSend, response);

    for(int i = 1; i < MXN; i++) {
        if(response[i] == 0) return i;
    }
    
    return 0;
}

int maxValue(int n, int w) {
    vector<int> candidates;
    for(int i = 0; i < MXN; i++) candidates.push_back(i);
    
    while(candidates.size() != 1) {
        int cnt = w / candidates.size();
        fill(toSend, toSend + MXN, 0);
        for(auto i : candidates) toSend[i] = cnt;
        playRound(toSend, response);
        candidates.clear();
        for(int i = 0; i < MXN; i++) if(response[i] > cnt) candidates.push_back(i);
    }

    return candidates[0];
}

int greaterValue(int n, int w) {
    int l = 0;
    int r = 10;

    while (l + 1 < r) {
        int m = (l+r)/2;
        toSend[0] = m;
        toSend[1] = m;
        playRound(toSend, response);

        if(response[0] <= m && response[1] <= m) {
            r = m;
        } else if(response[0] > m && response[1] > m) {
            l = m;
        } else {
            return response[0] < response[1];
        }
    }

    toSend[0] = r;
    toSend[1] = r;
    playRound(toSend, response);

    return response[0] < response[1];
}

int S[100];

bool compare1(int a, int b) {
    fill(toSend, toSend + MXN, 0);
    toSend[a] = 100;
    toSend[b] = 100;

    playRound(toSend, response);
    return response[a] < response[b];
}

void conquer(int l_l, int l_r, int r_l, int r_r) {
    queue<int> a, b, c;
    for(int i = l_l; i <= l_r; i++) a.push(S[i]);
    for(int i = r_l; i <= r_r; i++) b.push(S[i]);

    while(!a.empty() && !b.empty()) {
        if(compare1(a.front(), b.front())) {
            c.push(a.front());
            a.pop();
        } else {
            c.push(b.front());
            b.pop();
        }
    }

    while(!a.empty()) {
        c.push(a.front());
        a.pop();
    }

    while(!b.empty()) {
        c.push(b.front());
        b.pop();
    }

    for(int i = l_l; i <= r_r; i++) {
        S[i] = c.front();
        c.pop();
    }
}

void divide(int l, int r) {
    if(l != r) {
        int m = l + (r-l)/2;
        divide(l, m);
        divide(m+1, r);
        conquer(l, m, m+1, r);
    }
}

void allValues(int n, int w, int *p) {
    if (w == 2*n) {
        for(int i = 0; i < n; i++) S[i] = i;
        divide(0, n-1); // S is now sorted in order of the indices with increasing value
        
        for(int i = 0; i < n; i++) p[S[i]] = i+1;
    } else {
        // TODO: Implement Subtask 5 solution here.
        // You may leave this block unmodified if you are not attempting this
        // subtask.
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...