제출 #882358

#제출 시각아이디문제언어결과실행 시간메모리
882358pirhosig동굴 (IOI13_cave)C++17
100 / 100
683 ms860 KiB
#include "cave.h" #include <bits/stdc++.h> #define R(a) for (int i = 0; i < a; ++i) #define RR(a) for (int j = 0; j < a; ++j) using namespace std; bool testDoor(int swit[], int door) { int res = tryCombination(swit); if (door < res || res == -1) return true; else return false; } void exploreCave(int N) { int sPoses[N]; int switchStates[N]; int doorStates[N]; R(N) { sPoses[i] = -1; switchStates[i] = -1; doorStates[i] = -1; } R(N) { bool zero = false; if (doorStates[i] == -1) { int initialTestSwitches[N]; RR(N) { if (switchStates[j] == -1) initialTestSwitches[j] = 0; else initialTestSwitches[j] = switchStates[j]; } int res = tryCombination(initialTestSwitches); if (res == -1) { zero = true; for (int j = i; j < N; ++j) { doorStates[j] = 0; } } else if (i < res) { zero = true; for (int j = i; j < res; ++j) { doorStates[j] = 0; } } } else zero = true; if (zero) { int lower = 0; int upper = N - 1; int definite = -1; while (upper - lower > 1) { int mid = (lower + upper) / 2; int testSwitches[N]; RR(N) { if (switchStates[j] != -1) testSwitches[j] = switchStates[j]; else { if (lower <= j && j <= mid) testSwitches[j] = 0; else testSwitches[j] = 1; } } if (testDoor(testSwitches, i)) { upper = mid; } else { lower = mid; if (lower + 1 == upper) definite = upper; } } if (definite > -1) { sPoses[i] = definite; switchStates[definite] = 0; } else { int testSwitches[N]; RR(N) { if (switchStates[j] != -1) testSwitches[j] = switchStates[j]; else { if (j == lower) testSwitches[j] = 0; else testSwitches[j] = 1; } } if (testDoor(testSwitches, i)) { sPoses[i] = lower; switchStates[lower] = 0; } else { sPoses[i] = upper; switchStates[upper] = 0; } } } else { int lower = 0; int upper = N - 1; int definite = -1; while (upper - lower > 1) { int mid = (lower + upper) / 2; int testSwitches[N]; RR(N) { if (switchStates[j] != -1) testSwitches[j] = switchStates[j]; else { if (lower <= j && j <= mid) testSwitches[j] = 1; else testSwitches[j] = 0; } } if (testDoor(testSwitches, i)) { upper = mid; } else { lower = mid; if (lower + 1 == upper) definite = upper; } } if (definite > -1) { sPoses[i] = definite; switchStates[definite] = 1; } else { int testSwitches[N]; RR(N) { if (switchStates[j] != -1) testSwitches[j] = switchStates[j]; else { if (j == lower) testSwitches[j] = 1; else testSwitches[j] = 0; } } if (testDoor(testSwitches, i)) { sPoses[i] = lower; switchStates[lower] = 1; } else { sPoses[i] = upper; switchStates[upper] = 1; } } } } int switchesForDoors[N]; R(N) { switchesForDoors[sPoses[i]] = i; } /*R(N) { cout << switchesForDoors[i] << " "; } cout << endl; R(N) { cout << switchStates[i] << " "; } cout << endl;*/ answer(switchStates, switchesForDoors); }
#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...