Submission #1289931

#TimeUsernameProblemLanguageResultExecution timeMemory
1289931ChuanChenCave (IOI13_cave)C++20
0 / 100
266 ms596 KiB
#include "cave.h" #include<bits/stdc++.h> using namespace std; int n; vector<int> S, D; //S: correct position, D[i]: door connected by switch i void _answer(vector<int> S, vector<int> D){ int s[n], d[n]; for(int i = 0; i < S.size(); i++) s[i] = S[i]; for(int i = 0; i < D.size(); i++) d[i] = D[i]; answer(s, d); } int _tryCombination(vector<int> S){ int s[S.size()]; for(int i = 0; i < S.size(); i++) s[i] = S[i]; return tryCombination(s); } //encontra primeiro switch que muda porta e seu estado void bsearch(int porta){ //abre todas porta conhecidos, vector<int> guess = S, unknown; int verdic; for(int i = 0; i < n; i++){ if(guess[i] == -1){ guess[i] = 0; unknown.push_back(i); } } // 1 query para saber se switch deve ser aberto ou n verdic = _tryCombination(guess); // 13 query para saber onde esta esse switch if(verdic > porta){ //se der true, nossa porta fica aberta com 0 //busca binaria no unknown pra encontrar primeiro que der false; //000000000001111111111111 //TTTTTTFFFFFFFFFFFFFFFFFF //esse ^ daqui eh nosso switch int l = 0, r = unknown.size()-1; while(l < r){ int m = (l+r)/2; for(int i = 0; i <= m; i++) guess[unknown[i]] = 0; for(int i = m+1; i < unknown.size(); i++) guess[unknown[i]] = 1; verdic = _tryCombination(guess); if(verdic > porta) r = m; //porta esta no intervalo [0, m] else l = m+1; //porta esta no intervalo [m+1, fim] } S[l] = 0; D[l] = porta; } else{ //se der true, nossa porta fica aberta com 1 //busca binaria no unknown pra encontrar primeiro que der T; //1111111100000000000000000000 //TTTTTTFFFFFFFFFFFFFFFFFF //esse ^ daqui eh nosso switch int l = 0, r = unknown.size()-1; while(l < r){ int m = (l+r)/2; for(int i = 0; i <= m; i++) guess[unknown[i]] = 1; for(int i = m+1; i < unknown.size(); i++) guess[unknown[i]] = 0; verdic = _tryCombination(guess); if(verdic > porta) r = m; //porta esta no intervalo [0, m] else l = m+1; //porta esta no intervalo [m+1, fim] } S[l] = 1; D[l] = porta; } } void exploreCave(int N) { n = N; S.assign(N, -1); D.assign(N, -1); for(int i = 0; i < n; i++){ bsearch(i); } _answer(S, D); }
#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...