Submission #1281260

#TimeUsernameProblemLanguageResultExecution timeMemory
1281260dareleCave (IOI13_cave)C++20
13 / 100
18 ms504 KiB
#include "cave.h"
#include <iostream>

using namespace std;

// Subtareas 1, 2 y 3
// void exploreCave(int N) {
//     int puerta[N];
//     int pos[N];
//     bool vis[N];
//     for (int i = 0; i < N; i++) {
//         pos[i] = 0;
//         puerta[i] = -1;
//         vis[i] = 0;
//     }
//     int prev = tryCombination(pos);
//     int ans;
//     while (prev != -1) {
//         for (int i = 0; i < N; i++) {
//             if (vis[i]) continue;
//             pos[i] = 1;
//             ans = tryCombination(pos);
//             if (ans > prev || ans == -1) {
//                 vis[i] = 1;
//                 prev = ans;
//                 break;
//             }
//             if (ans < prev) {
//                 vis[i] = 1;
//             }
//             pos[i] = 0;
//         }
//     }
//     for (int i = 0; i < N; i++) {
//         pos[i] = (pos[i] + 1) % 2;
//         int ans = tryCombination(pos);
//         puerta[i] = ans;
//         pos[i] = (pos[i] + 1) % 2;
//     }
//     answer(pos, puerta);
// }

void exploreCave(int N) {
    int puerta[N];
    int pos[N];
    bool vis[N];
    for (int i = 0; i < N; i++) {
        pos[i] = 0;
        puerta[i] = -1;
        vis[i] = 0;
    }
    int prev;
    int ans;
    int ini, fin, mid;
    while (1) {
        prev = tryCombination(pos);
        if (prev == -1) {
            break;
        }
        ini = 0;
        fin = N;
        mid = (ini + fin) / 2;
        while (fin - ini > 1) {
            mid = (ini + fin) / 2;
            for (int i = ini; i < mid; i++) {
                pos[i] = 1;
            }
            ans = tryCombination(pos);
            if (ans == -1) break;
            for (int i = ini; i < mid; i++) {
                if (vis[i]) continue;
                pos[i] = 0;
            }
            if (ans > prev) {
                fin = mid;
            } else {
                ini = mid;
            }
        }
        if (ans == -1) break;
        mid = (ini + fin) / 2;
        pos[mid] = 1;
        vis[mid] = 1;
    }
    for (int i = 0; i < N; i++) {
        pos[i] = (pos[i] + 1) % 2;
        int ans = tryCombination(pos);
        puerta[i] = ans;
        pos[i] = (pos[i] + 1) % 2;
    }
    answer(pos, puerta);
}
#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...