Submission #830034

# Submission time Handle Problem Language Result Execution time Memory
830034 2023-08-18T17:47:56 Z GusterGoose27 Koala Game (APIO17_koala) C++17
37 / 100
81 ms 464 KB
#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 <= 100);
    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++;
        }
    }
}

vector<int> answer;

int sum(int a) {
    return a*(a+1)/2;
}

void solve(int l, int r, vector<int> &rev) { // ignore everything above r essentially
    if (l > r) return;
    if (l == r) {
        answer[l] = rev[0];
        return;
    }
    int put = 0;
    if (l > 0) {int b = 0;
        do {
            put++;
            b += r-l+1;
        } while (sum(min(l, b))-sum(b-(put+1)) <= l+1);
    }
    else put = 1;
    vector<int> qry(n, 0);
    for (int v: rev) qry[v] = put;
    vector<int> up = inter(query(qry), rev);
    vector<int> down = inter(complement(up), rev);
    solve(r-up.size()+1, r, up);
    solve(l, r-up.size(), down);
}

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 {
        answer = vector<int>(n);
        vector<int> curv(n);
        iota(curv.begin(), curv.end(), 0);
        solve(0, n-1, curv);
        for (int i = 0; i < n; i++) P[answer[i]] = i+1;
    }
}
# Verdict Execution time Memory Grader output
1 Correct 3 ms 208 KB Output is correct
2 Correct 3 ms 208 KB Output is correct
3 Correct 3 ms 208 KB Output is correct
4 Correct 3 ms 208 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 208 KB Output is correct
2 Correct 11 ms 324 KB Output is correct
3 Correct 11 ms 208 KB Output is correct
4 Correct 10 ms 320 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 81 ms 352 KB Output is correct
2 Correct 63 ms 328 KB Output is correct
3 Correct 64 ms 328 KB Output is correct
4 Correct 62 ms 328 KB Output is correct
5 Correct 80 ms 328 KB Output is correct
6 Correct 66 ms 332 KB Output is correct
7 Correct 65 ms 332 KB Output is correct
8 Correct 63 ms 336 KB Output is correct
9 Correct 63 ms 332 KB Output is correct
10 Correct 62 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 5 ms 464 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 208 KB Output isn't correct
2 Halted 0 ms 0 KB -