제출 #1370671

#제출 시각아이디문제언어결과실행 시간메모리
1370671Ekber_Ekber동굴 (IOI13_cave)C++20
100 / 100
95 ms628 KiB
#include "cave.h"
#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;

constexpr int MAX = 2e+5 + 1, INF = 2e+9, MOD = 1e+9 + 7, K = 31;

vector <int> null;
int n;

int ask(vector <int> &v) {
    int a[n];
    for (int i = 0; i < n; i++) a[i] = v[i];
    return tryCombination(a);
}

int get(int x, vector <int> v) {
    vector <int> f = null;
    int t = 0;
    int q1 = ask(f);
    // if (q1 < x) {
        // abort();
    // }
    if (q1 == x) {
        t ^= 1;
    }
    for (int &i : v) f[i] = t;
    int l = 0, r = v.size() - 1;
    while (l < r) {
        int mid = (l + r) / 2;
        for (int i = l; i <= mid; i++) {
            f[v[i]] = 1 - t;
        }
        int q2 = ask(f);
        int nl = l, nr = r;
        if (q2 == x) {
            nr = mid;
        }
        else nl = mid + 1;
        for (int i = l; i <= mid; i++) f[v[i]] = t;
        l = nl, r = nr;
    }
    null[v[l]] = t;
    return v[l];
}

void exploreCave(int N) {
    n = N;
    null.assign(n, 0);
    vector <int> v;
    for (int i = 0; i < n; i++) v.pb(i);
    int S[n], D[n];
    for (int i = 0; i < n; i++) {
        int id = get(i, v);
        S[id] = i;
        // cerr << id << endl;
        vector <int> nv;
        for (int &j : v) {
            if (j == id) continue;
            nv.pb(j);
        }
        v.swap(nv);
        // for (int &j : null) cerr << j << ' '; cerr << endl;
    }
    for (int i = 0; i < n; i++) {
        D[i] = null[i];
    }
    answer(D, S);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…