제출 #289308

#제출 시각아이디문제언어결과실행 시간메모리
289308zecookiezAliens (IOI07_aliens)C++17
80 / 100
4 ms512 KiB
#include <bits/stdc++.h> using namespace std; template<class C>constexpr int len(const C&c){return int(c.size());} const int DDX[13] = {-2, 0, 2, -1, 1, -2, 0, 2, -1, 1, -2, 0, 2}; const int DDY[13] = {-2, -2, -2, -1, -1, 0, 0, 0, 1, 1, 2, 2, 2}; long long N; bool rng(long long X){ return 1 <= X && X <= N; } map<pair<long long, long long>, bool> memo; bool query(long long X, long long Y){ if(!rng(X) || !rng(Y)) return false; if(memo.count(make_pair(X, Y))) return memo[make_pair(X, Y)]; assert(memo.size() < 300); cout << "examine " << X << " " << Y << endl; string s; cin >> s; return memo[make_pair(X, Y)] = (s == "true"); } int main(){ cin.sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("paintbarn.in", "r", stdin); //freopen("paintbarn.out", "w", stdout); long long XS, YS, X1, Y1, X2, SZ, XC, YC; cin >> N >> XS >> YS; // find offset from center of current square X1 = XS; Y1 = YS; while(true){ long long i = 1; for(;;i+=i){ if(!query(X1 + i, Y1)){ X1 += i / 2LL; break; } } long long L = X1, R = X1 + i / 2LL, MID; while(R - L > 1){ MID = L + (R - L) / 2; if(query(MID, Y1)) L = MID; else R = MID; } X1 = L; if(!query(X1 + 1, Y1)) break; } X2 = XS; while(true){ long long i = 1; for(;; i += i){ if(!query(X2 - i, Y1)){ X2 -= i / 2LL; break; } } long long L = X2 - i / 2LL, R = X2, MID; while(R - L > 1){ MID = L + (R - L) / 2; if(query(MID, Y1)) R = MID; else L = MID; } X2 = R; if(!query(X2 - 1, Y1)) break; } // stupid SZ = X1 - X2 + 1; XC = (X1 + X2) / 2; while(true){ long long i = 1; for(;; i += i){ if(!query(XC, Y1 - i)){ Y1 -= i / 2LL; break; } } long long L = Y1 - i / 2LL, R = Y1, MID; while(R - L > 1){ MID = L + (R - L) / 2; if(query(XC, MID)) R = MID; else L = MID; } X2 = R; if(!query(XC, Y1 - 1)) break; } YC = Y1 + SZ / 2; // +41 queries for(int i = 0; i < 13; ++i){ X1 = XC + SZ * DDX[i]; Y1 = YC + SZ * DDY[i]; if(!rng(X1) || !rng(Y1)) continue; int cnt = 0; for(int j = 0; j < 13; ++j){ XS = X1 + SZ * DDX[j]; YS = Y1 + SZ * DDY[j]; if(rng(XS) && rng(YS) && query(XS, YS)) ++cnt; else break; } if(cnt == 13){ cout << "solution " << X1 << " " << Y1 << endl; memo.clear(); return 0; } } memo.clear(); assert(false); return 0; }
#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...
#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...