Submission #829895

#TimeUsernameProblemLanguageResultExecution timeMemory
829895GusterGoose27Koala Game (APIO17_koala)C++17
47 / 100
74 ms340 KiB
#include "koala.h"

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 105;
bool pres[MAXN];
int n, w;
int t = 0;

vector<int> query(vector<int> &inp) {
    int *a = new int[n];
    int *b = new int[n];
    for (int i = 0; i < n; i++) a[i] = inp[i];
    playRound(a, b);
    vector<int> out;
    for (int i = 0; i < n; i++) {
        if (b[i] > inp[i]) out.push_back(i);
    }
    delete[] a;
    delete[] b;
    return out;
}

vector<int> complement(vector<int> inp) {
    fill(pres, pres+n, 0);
    for (int v: inp) pres[v] = 1;
    vector<int> out;
    for (int i = 0; i < n; i++)
        if (!pres[i]) out.push_back(i);
    return out;
}

vector<int> inter(vector<int> a, vector<int> &b) {
    fill(pres, pres+n, 0);
    for (int v: a) pres[v] = 1;
    vector<int> out;
    for (int v: b)
        if (pres[v]) out.push_back(v);
    return out;
}

int minValue(int N, int W) {
    n = N; w = W;
    vector<int> vals(n, 0);
    vals[0] = 1;
    return complement(query(vals))[0];
}

int maxValue(int N, int W) {
    n = N; w = W;
    vector<int> cur(n, 0);
    iota(cur.begin(), cur.end(), 0);
    while (cur.size() > 1) {
        int put = n/cur.size();
        vector<int> qry(n, 0);
        for (int v: cur) qry[v] = put;
        cur = inter(query(qry), cur);
    }
    return cur[0];
}

int greaterValue(int N, int W) {
    n = N; w = W;
    vector<int> put({1, 2, 5, 10});
    int mn = -1, mx = 4;
    vector<int> two({0, 1});
    while (mx > mn+1) {
        int cur = (mn+mx)/2;
        vector<int> qry(n, 0);
        qry[0] = qry[1] = put[cur];
        vector<int> vals = inter(query(qry), two);
        if (vals.size() == 2) mn = cur;
        else if (vals.empty()) mx = cur;
        else {
            return vals[0];
        }
    }
    assert(false);
    return 0;
}

bool smaller(int &a, int &b) {
    t++;
    // assert(t <= 700);
    vector<int> qry(n, 0);
    qry[a] = qry[b] = n;
    vector<int> two({a, b});
    return inter(query(qry), two)[0] == b;
}

void make_sort(vector<int> &a, int l, int r) {
    if (r <= l) return;
    vector<int> ex;
    int mid = (l+r)/2;
    make_sort(a, l, mid);
    make_sort(a, mid+1, r);
    for (int i = l; i <= r; i++) ex.push_back(a[i]);
    int p1 = 0, p2 = mid+1-l;
    int j = 0;
    while (p1 <= mid-l || p2 <= r-l) {
        if (p1 > mid-l) {
            a[l+(j++)] = ex[p2];
            p2++;
        }
        else if (p2 > r-l) {
            a[l+(j++)] = ex[p1];
            p1++;
        }
        else if (smaller(ex[p1], ex[p2])) {
            a[l+(j++)] = ex[p1];
            p1++;
        }
        else {
            a[l+(j++)] = ex[p2];
            p2++;
        }
    }
}

void allValues(int N, int W, int *P) {
    n = N; w = W;
    if (W == 2*N) {
        t = 0;
        vector<int> ans(n);
        iota(ans.begin(), ans.end(), 0);
        make_sort(ans, 0, n-1);
        // sort(ans.begin(), ans.end(), comp);
        for (int i = 0; i < n; i++) P[ans[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...