Submission #1123115

#TimeUsernameProblemLanguageResultExecution timeMemory
1123115crafticatThe Collection Game (BOI21_swaps)C++17
3 / 100
281 ms420 KiB
#include <bits/stdc++.h>

using namespace std;
#define F0R(i, n) for (int i = 0; i < n;i++)
#define FOR(i, j, n) for (int i = j;i < n;i++)

template<typename T>
using V = vector<T>;
using vi = V<int>;
constexpr int INF = 1e9 + 7;
using pi = pair<int,int>;

void schedule(int, int);

std::vector<int> visit();

void answer(std::vector<int>);

void solve(int n, int v) {
    vi arr(n);
    F0R(i, n)
        arr[i] = i + 1;

    F0R(iter, n * 10) {
        for (int i = 0; i + 1< n; i+=2) {
            schedule(arr[i], arr[i + 1]);
        }
        vi res = visit();
        int step = 0;
        for (int i = 0; i + 1 < n; i+=2) {
            if (res[step++]) swap(arr[i], arr[i]);
        }

        for (int i = 1; i + 1 < n; i+=2) {
            schedule(arr[i], arr[i + 1]);
        }
        res = visit();
        step = 0;
        for (int i = 1; i + 1< n; i+=2) {
            if (res[step++]) swap(arr[i], arr[i]);
        }
    }

    answer(arr);
}

#if DEBUG
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <vector>


using namespace std;

void __attribute__((noreturn)) __attribute__((format(printf, 1, 2))) result(const char *msg, ...) {
    va_list args;
    va_start(args, msg);
    vfprintf(stderr, msg, args);
    fprintf(stderr, "\n");
    va_end(args);
    exit(0);
}

namespace {
    int N, V2, visits;
    set<int> queryIndices;
    vector<int> A, queryResult;
}

void schedule(int i, int j) {
    printf("schedule(%d, %d)\n", i, j);
    fflush(stdout);

    if (i < 1 || i > N || j < 1 || j > N || i == j)
        result("Invalid schedule");
    if (queryIndices.find(i) != queryIndices.end() || queryIndices.find(j) != queryIndices.end())
        result("Invalid schedule");
    queryIndices.insert(i);
    queryIndices.insert(j);

    int s = A[j]< A[i];
    if (s)
        swap(A[i], A[j]);
    queryResult.push_back(A[i] < A[j]);
}

vector<int> visit() {
    printf("visit(): {");
    for (int i = 0; i < (int)queryResult.size(); i++) {
        printf("%d", queryResult[i]);
        if (i + 1 != (int)queryResult.size())
            printf(", ");
    }
    printf("}\n");
    fflush(stdout);

    visits++;
    if (visits > V2)
        result("Out of visits");

    vector<int> res = queryResult;
    queryIndices.clear();
    queryResult.clear();
    return res;
}

void answer(vector<int> r) {
    printf("answer({");
    for (int i = 0; i < (int)r.size(); i++) {
        printf("%d", r[i]);
        if (i + 1 != (int)r.size())
            printf(", ");
    }
    printf("})\n");

    if ((int)r.size() != N)
        result("Invalid answer");

    for (int i = 0; i < N; i++) {
        if (r[i] < 1 || r[i] > N)
            result("Invalid answer");
        if (A[r[i]] != i + 1)
            result("Wrong answer");
    }

    result("Correct: %d visit(s) used", visits);
}

int main() {
    if (scanf("%d %d", &N, &V2) != 2 || N < 1 || V2 < 0)
        result("Invalid input");

    A.resize(N + 1);
    for (int i = 1; i <= N; i++) {
        int x;
        if (scanf("%d", &x) != 1 || x < 1 || x > N || A[x])
            result("Invalid input");
        A[x] = i;
    }

    solve(N, V2);

    result("No answer");
}
#endif
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...