Submission #107363

#TimeUsernameProblemLanguageResultExecution timeMemory
107363dolphingarlic동굴 (IOI13_cave)C++14
100 / 100
827 ms664 KiB
#include <bits/stdc++.h>
#include "cave.h"
#pragma GCC optimize("O3")
#define FOR(i, x, y) for(int i = x; i < y; i++)
typedef long long ll;
using namespace std;

void exploreCave(int N) {
    int known[5000], D[5000], S[5000], T[5000];
    fill(known, known + N, -1);
    FOR(i, 0, N) {
        fill(S, S + N, 1);
        FOR(j, 0, i) S[D[j]] = known[j];
        // Find state of i-th gate
        int res = tryCombination(S);
        if (res <= i && res != -1) known[i] = 0;
        else known[i] = 1;
        // cout << known[i] << '\n';

        // Binary search for D[i]
        int l = 0, r = N - 1;
        while (l != r) {
            int mid = (l + r) / 2;
            fill(T, T + N, 1 - known[i]);
            fill(T + l, T + mid + 1, known[i]);
            FOR(j, 0, i) T[D[j]] = known[j];
            // FOR(i, 0, N) cout << T[i] << ' '; cout << '\n';
            int res = tryCombination(T);
            // cout << res << ' ' << mid << '\n';
            if (res <= i && res != -1) l = mid + 1;
            else r = mid;
        }
        D[i] = l;
        // FOR(i, 0, N) cout << D[i] << ' ';
        // cout << "\n\n";
    }
    // FOR(i, 0, N) cout << known[i] << ' '; cout << '\n';
    // FOR(i, 0, N) cout << D[i] << ' '; cout << '\n';
    int a[5001], b[5001];
    FOR(i, 0, N) {
        a[D[i]] = known[i];
        b[D[i]] = i;
    }
    answer(a, b);
}
#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...