Submission #1364118

#TimeUsernameProblemLanguageResultExecution timeMemory
1364118coin_Cave (IOI13_cave)C++20
100 / 100
307 ms520 KiB
#include <bits/stdc++.h>
#include "cave.h"
using namespace std;

// 0 means default, 1 means switch opposite
vector<int> cur, mapping;

int ask(int lim, int n){
    int askVector[n] = {0};
    for (int i = 0; i <= lim; i++){
        askVector[i] = 1;
    }
    for (int i = 0; i < n; i++){
        if (cur[i] != -1) askVector[i] = cur[i];
    }
    // for (int i = 0; i < n; i++){
    //     cout << askVector[i];
    // }
    // cout << endl;
    return tryCombination(askVector);
}

void findKDoor(int k, int n){
    // ask to find whether door is open or not, it is open when fi == k
    // cout << "For door " << k << " ask for switch 0 to 0" << endl;
    int fi = ask(-1, n);
    int l = 0, r = n-1;
    while(l < r){
        int mid = (l + r)/2;
        // switches flip does affect, 0 -> mid-1 does contain it
        // cout << "For door " << k << " ask for switch 0 to " << mid << endl;
        if ((ask(mid, n) == k) != (fi == k)){
            r = mid;
        }
        else{
            l = mid + 1;
        }
    }

    // cout << "Found switch " << r << " for door " << k << endl;
    // cout << "Should be " << (fi == k) << " to keep open" << endl; 
    mapping[r] = k;
    cur[r] = (fi == k);
}

void exploreCave(int N) {
    int n = N;
    cur.assign(n, -1);
    mapping.assign(n, 0);

    for (int k = 0; k < n; k++){
        findKDoor(k, n);
    }

    int s[n], d[n];
    for (int i = 0; i < n; i++){
        s[i] = cur[i];
        d[i] = mapping[i];
    }
    answer(s, d);
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...