Submission #466421

#TimeUsernameProblemLanguageResultExecution timeMemory
466421FatihSolakAliens (IOI07_aliens)C++17
100 / 100
2 ms296 KiB
#include <bits/stdc++.h> #define int long long using namespace std; int n,x,y; int cnt = 0; map<pair<int,int>,string> mp; bool ask(int pos1,int pos2){ if(mp[{pos1,pos2}] != "")return mp[{pos1,pos2}] == "true"; if(min(pos1,pos2) < 1 || max(pos1,pos2) > n)return 0; cnt++; if(cnt > 300)exit(0); assert(cnt <= 300); cout << "examine " << pos1 << " " << pos2 << endl; cin >> mp[{pos1,pos2}]; return mp[{pos1,pos2}] == "true"; } pair<int,int> lift(int pos1,int pos2,int m,int dir1,int dir2){ for(int i=30;i>=0;i--){ if((1<<i) <= m && ask(pos1 + dir1*(1<<i),pos2 + dir2*(1<<i))){ pos1 += dir1*(1<<i); pos2 += dir2*(1<<i); m -= (1<<i); } } return make_pair(pos1,pos2); } pair<int,int> find(int pos1,int pos2,int dir1,int dir2){ for(int i = 1;;i*=2){ if(!ask(pos1 + dir1*i,pos2+dir2*i)){ return lift(pos1,pos2,i,dir1,dir2); } } } void solve(){ cin >> n >> x >> y; int m = -1; int posx = -1,posy = -1; int l = find(x,y,-1,0).first, r = find(x,y,1,0).first; m = r-l+1; posx = l; posy = lift(x,y,m,0,-1).second; for(int i=0;i<2;i++){ if(ask(posx - m*2,posy))posx -= m*2; if(ask(posx ,posy - m*2))posy -= m*2; } if(ask(posx - m,posy-m)){ posx -= m; posy -= m; } posx += 2*m + m/2; posy += 2*m + m/2; cout << "solution " << posx << " " << posy << endl; } int32_t main(){ solve(); }
#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...