Submission #1173481

#TimeUsernameProblemLanguageResultExecution timeMemory
1173481anmattroiKoala Game (APIO17_koala)C++17
100 / 100
36 ms460 KiB
#include "koala.h"
#include <bits/stdc++.h>

using namespace std;

int minValue(int N, int W) {
    vector<int> B(N, 0), R(N, 0);

    B[0] = 1;

    playRound(B.data(), R.data());
    if (R[0] < 2) return 0;
    for (int i = 1; i < N; i++)
        if (!R[i]) return i;
    return 0;
}

int maxValue(int N, int W) {
    vector<int> candidates, B(N, 0), R(N, 0);

    for (int i = 0; i < N; i++) candidates.emplace_back(i);
    while (candidates.size() > 1) {
        int k = W / candidates.size();
        fill(B.begin(), B.end(), 0);
        for (int i : candidates) B[i] = k;
        playRound(B.data(), R.data());
        candidates.clear();
        for (int i = 0; i < N; i++)
            if (R[i] > k) candidates.emplace_back(i);
    }
    return candidates[0];
}

int greaterValue(int N, int W) {
    int lo = 1, hi = 9;
    vector<int> B(N, 0), R(N, 0);
    while (lo != hi) {
        int mid = (lo + hi) >> 1;
        B[0] = B[1] = mid;
        playRound(B.data(), R.data());
        if (R[0] > mid && R[1] > mid) lo = mid+1;
        else if (R[0] <= mid && R[1] <= mid) hi = mid-1;
        else return (R[0] < R[1]);
    }
    B[0] = B[1] = lo;
    playRound(B.data(), R.data());
    return (R[0] < R[1]);
}

void allValues(int N, int W, int *P) {
    if (W == 2*N) {
        vector<int> B(N, 0), R(N, 0);

        function<vector<int>(int, int)> merge_sort = [&](int lo, int hi) {
            if (lo == hi) return vector<int>(1, lo);
            int mid = (lo + hi) >> 1;
            vector<int> Lef = merge_sort(lo, mid), Rig = merge_sort(mid+1, hi);
            vector<int> ans;
            int l = 0, r = 0;
            while (l < Lef.size() || r < Rig.size()) {
                if (l == Lef.size()) {ans.emplace_back(Rig[r]); ++r; continue;}
                if (r == Rig.size()) {ans.emplace_back(Lef[l]); ++l; continue;}
                int u = Lef[l], v = Rig[r];
                B[u] = B[v] = W/2;
                playRound(B.data(), R.data());
                B[u] = B[v] = 0;

                if (R[u] < R[v]) {
                    ans.emplace_back(Lef[l]); ++l;
                } else {
                    ans.emplace_back(Rig[r]); ++r;
                }
            }
            return ans;
        };
        vector<int> Lis = merge_sort(0, N-1);
        for (int i = 0; i < N; i++) P[Lis[i]] = i+1;
    } else {
        vector<int> B(N, 0), R(N, 0);

        function<void(vector<int>, int, int)> split = [&](vector<int> v, int lo, int hi) {
            if (lo == hi) {
                P[v[0]] = lo;
                return;
            }
            int x = min(int(sqrt(2*lo)), W / (hi-lo+1));
            fill(B.begin(), B.end(), 0);
            for (int i : v) B[i] = x;
            playRound(B.data(), R.data());
            vector<int> lesser, morer;
            for (int i : v)
                if (R[i] > x) morer.emplace_back(i);
                else lesser.emplace_back(i);
            split(lesser, lo, lo+lesser.size()-1);
            split(morer, lo+lesser.size(), hi);
        };
        vector<int> v(N, 0);
        for (int i = 0; i < N; i++) v[i] = i;
        split(v, 1, N);
    }
}
#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...