제출 #847809

#제출 시각아이디문제언어결과실행 시간메모리
847809sentheta동굴 (IOI13_cave)C++17
100 / 100
880 ms1072 KiB
#include "cave.h" #ifdef VANWIJ #include"/home/user/code/bits/stdc++.h" #define DBG 1 #else #include"bits/stdc++.h" #define DBG 0 #endif using namespace std; #define Int long long #define V vector #define pii pair<int,int> #define ff first #define ss second static mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); #define pow2(x) (1LL<<(x)) #define msb(x) (63-__builtin_clzll(x)) #define bitcnt(x) (__builtin_popcountll(x)) #define nl '\n' #define _ << ' ' << #define all(x) (x).begin(), (x).end() #define rep(i,a,b) for(int i = (int)(a); i < (int)(b); i++) #define cerr if(DBG) cout #define dbg(x) {cerr << "?" << #x << " : " << (x) << endl << flush;} const int N = 5005; int n; int ansState[N], ansDoor[N]; int q[N]; int ask(){ int ret = tryCombination(q); if(ret==-1) ret = n; return ret; } bool can[N]; void exploreCave(int _n){ n = _n; rep(i,0,n){ ansDoor[i] = -1; } // find switch that link to door rep(door,0,n){ dbg(door); // correct and wrong states int correct, wrong; rep(i,0,n){ can[i] = ansDoor[i]==-1; if(can[i]){ q[i] = 1; } } { int ret = ask(); if(ret > door){ correct = 1; wrong = 0; } else{ correct = 0; wrong = 1; } } while(1){ int cnt = 0; rep(i,0,n){ cnt += can[i]; } if(cnt==1) break; bool flag = 0; rep(i,0,n) if(can[i]){ if(flag) q[i] = correct; else q[i] = wrong; flag ^= 1; } int ret = ask(); if(ret > door){ rep(i,0,n) if(can[i]){ can[i] &= q[i]==correct; } } else{ rep(i,0,n) if(can[i]){ can[i] &= q[i]==wrong; } } } int x = 0; while(!can[x]) x++; q[x] = correct; ansState[x] = correct; ansDoor[x] = door; } answer(ansState, ansDoor); }
#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...