Submission #1359770

#TimeUsernameProblemLanguageResultExecution timeMemory
1359770brian0800Cave (IOI13_cave)C++20
100 / 100
125 ms604 KiB
#include "cave.h"
#include <bits/stdc++.h>
using namespace std;

void exploreCave(int N) {
    vector<int> S(N, 0);      // switch 正確狀態
    vector<int> D(N, -1);     // switch -> door
    vector<int> used(N, 0);   // 是否已確定

    auto ok = [&](int x, int i) {
        // door i 是否是開的
        return (x == -1 || x > i);
    };

    for (int i = 0; i < N; i++) {
        vector<int> cur(N, 0);

        // 已確定的固定,其餘先設 0
        for (int j = 0; j < N; j++) {
            if (used[j]) cur[j] = S[j];
            else cur[j] = 0;
        }

        int base = tryCombination(cur.data());

        // 在「未確定的 switch」中做二分
        vector<int> cand;
        for (int j = 0; j < N; j++) {
            if (!used[j]) cand.push_back(j);
        }

        int L = 0, R = (int)cand.size() - 1;

        while (L < R) {
            int mid = (L + R) / 2;

            vector<int> tmp = cur;

            // flip cand[L..mid]
            for (int k = L; k <= mid; k++) {
                int j = cand[k];
                tmp[j] ^= 1;
            }

            int res = tryCombination(tmp.data());

            // 比較「door i 是否開」
            if (ok(base, i) == ok(res, i)) {
                // 沒影響 → 答案在右半
                L = mid + 1;
            } else {
                // 有影響 → 在左半
                R = mid;
            }
        }

        int sw = cand[L];

        // 決定這個 switch 的正確狀態
        vector<int> tmp = cur;
        tmp[sw] = 1;
        int res = tryCombination(tmp.data());

        if (ok(res, i)) {
            S[sw] = 1;
        } else {
            S[sw] = 0;
        }

        used[sw] = 1;
        D[sw] = i;
    }

    answer(S.data(), D.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...