제출 #1259648

#제출 시각아이디문제언어결과실행 시간메모리
1259648Zbyszek99Worm Worries (BOI18_worm)C++20
0 / 100
408 ms9804 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define ull unsigned long long #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define vi vector<int> #define vl vector<long long> #define pb push_back #define rep(i, b) for(int i = 0; i < (b); ++i) #define rep2(i,a,b) for(int i = a; i <= (b); ++i) #define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c) #define count_bits(x) __builtin_popcountll((x)) #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define forall(it,x) for(auto& it:(x)) using namespace __gnu_pbds; using namespace std; typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; //mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll los(ll a, ll b) {return a + (mt() % (b-a+1));} const int INF = 1e9+50; const ll INF_L = 1e18+40; const ll MOD = 1e9+7; ll n,m,k,q; map<ll,int> query_map; int ask(int x, int y, int z) { // return tab[x][y][z]; x++; y++; z++; if(x < 1 || x > n || y < 1 || y > m || z < 1 || z > k) return 0; int h = x-1 + (y-1)*n + (z-1)*n*m; if(query_map.find(h) != query_map.end()) return query_map[h]; cout << "? " << x << " " << y << " " << z << endl; cin >> query_map[h]; return query_map[h]; } bool check(int x, int y, int z) { return ask(x,y,z) >= max({ask(x-1,y,z),ask(x+1,y,z),ask(x,y-1,z),ask(x,y+1,z),ask(x,y,z-1),ask(x,y,z+1)}); } pair<int,pii> solve(int ln, int rn, int lm, int rm, int lk, int rk) { int n_cost = (rm-lm+1)*(rk-lk+1); int m_cost = (rn-ln+1)*(rk-lk+1); int k_cost = (rm-lm+1)*(rn-ln+1); if(rn-ln <= 1 || rm-lm <= 1) { rep2(x,ln,rn) { rep2(y,lm,rm) { rep2(z,lk,rk) { if(check(x,y,z)) { return {x,{y,z}}; } } } } return {-1,{-1,-1}}; } if(n_cost == min({n_cost,m_cost,k_cost})) { pair<int,pair<int,pii>> best = {-1,{-1,{-1,-1}}}; int n_mid = (ln+rn)/2; rep2(y,lm,rm) { rep2(z,lk,rk) { best = max(best,{ask(n_mid,y,z),{n_mid,{y,z}}}); } } int nxt_val = ask(best.ss.ff+1,best.ss.ss.ff,best.ss.ss.ss); int nxt_val2 = ask(best.ss.ff-1,best.ss.ss.ff,best.ss.ss.ss); if(check(best.ss.ff,best.ss.ss.ff,best.ss.ss.ss)) { return best.ss; } if((nxt_val >= best.ff && n_mid+1 <= rn) || n_mid-1 < ln) { return solve(n_mid+1,rn,lm,rm,lk,rk); } else { return solve(ln,n_mid-1,lm,rm,lk,rk); } } else if(m_cost == min({m_cost,k_cost})) { pair<int,pair<int,pii>> best = {-1,{-1,{-1,-1}}}; int m_mid = (lm+rm)/2; rep2(x,ln,rn) { rep2(z,lk,rk) { best = max(best,{ask(x,m_mid,z),{x,{m_mid,z}}}); } } int nxt_val = ask(best.ss.ff,best.ss.ss.ff+1,best.ss.ss.ss); if(check(best.ss.ff,best.ss.ss.ff,best.ss.ss.ss)) { return best.ss; } if((nxt_val >= best.ff && m_mid+1 <= rm) || m_mid-1 < lm) { return solve(ln,rn,m_mid+1,rm,lk,rk); } else { return solve(ln,rn,lm,m_mid-1,lk,rk); } } else { pair<int,pair<int,pii>> best = {-1,{-1,{-1,-1}}}; int k_mid = (lk+rk)/2; rep2(x,ln,rn) { rep2(y,lm,rm) { best = max(best,{ask(x,y,k_mid),{x,{y,k_mid}}}); } } // cout << best.ss.ff << " " << best.ss.ss.ff << " " << best.ss.ss.ss << " best\n"; int nxt_val = ask(best.ss.ff,best.ss.ss.ff,best.ss.ss.ss+1); if(check(best.ss.ff,best.ss.ss.ff,best.ss.ss.ss)) { return best.ss; } if((nxt_val >= best.ff && k_mid+1 <= rk) || k_mid-1 < lk) { return solve(ln,rn,lm,rm,k_mid+1,rk); } else { return solve(ln,rn,lm,rm,lk,k_mid-1); } } } int main() { cin >> n >> m >> k >> q; // rep(i,n) // { // rep(j,m) // { // rep(d,k) cin >> tab[i][j][d]; // } // } pair<int,pii> ans = solve(0,n-1,0,m-1,0,k-1); int x = ans.ff; int y = ans.ss.ff; int z = ans.ss.ss; //if(x != -1 && y != -1 && z != 1 && check(x,y,z)) cout << "ok\n"; //else cout << "nie\n"; cout << "! " << ans.ff+1 << " " << ans.ss.ff+1 << " " << ans.ss.ss+1 << "\n"; }
#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...