제출 #548178

#제출 시각아이디문제언어결과실행 시간메모리
548178Sergio_2357동굴 (IOI13_cave)C++17
0 / 100
1018 ms452 KiB
#include "cave.h"
#include <bits/stdc++.h>

using namespace std;

typedef vector<int> vi;

int find_pos(int d, vi& pos, vi& corr)
{
    int n = pos.size();
    vector<int> t(n, 0);
    for (int i = 0; i < d; i++)
        t[pos[i]] = corr[i];

    return tryCombination(t.data()) == d;
}

bool test_range(int b, int e, int d, vi& used, vi& pos, vi& corr)
{
    int n = pos.size();
    vector<int> t(n, 1 - corr[d]);
    for (int i = 0; i < d; i++)
        t[pos[i]] = corr[i];
    int c = 0;
    for (int i = 0; i < n; i++) {
        if (used[i])
            continue;
        if (c >= b && c < e)
            t[i] = corr[d];
        c++;
    }
    return tryCombination(t.data()) != d;
}

void exploreCave(int n)
{
    vi pos(n, -1);
    vi corr(n, -1);
    vi used(n, 0);
    for (int d = 0; d < n; d++) {
        corr[d] = find_pos(d, pos, corr);
        int l = 0;
        int h = n - d - 1;
        while (l < h - 1) {
            int m = (h - l) / 2 + l;
            if (test_range(l, m, d, used, pos, corr))
                h = m;
            else
                l = m;
        }
        pos[d] = l;
    }
    vi S(n);
    for (int i = 0; i < n; i++)
        S[pos[i]] = corr[i];
    answer(S.data(), pos.data());
}
#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...