Submission #1169821

#TimeUsernameProblemLanguageResultExecution timeMemory
1169821nguyentunglamWorm Worries (BOI18_worm)C++20
10 / 100
370 ms416 KiB
#include <bits/stdc++.h> using namespace std; namespace std { template <int D, typename T> struct Vec : public vector<Vec<D - 1, T>> { static_assert(D >= 1, "Dimension must be positive"); template <typename... Args> Vec(int n = 0, Args... args) : vector<Vec<D - 1, T>>(n, Vec<D - 1, T>(args...)) {} }; template <typename T> struct Vec<1, T> : public vector<T> { Vec(int n = 0, T val = T()) : std::vector<T>(n, val) {} }; /* Example Vec<4, int64_t> f(n, k, 2, 2); // = f[n][k][2][2]; Vec<2, int> adj(n); // graph */ template <class Fun> class y_combinator_result { Fun fun_; public: template <class T> explicit y_combinator_result(T&& fun) : fun_(std::forward<T>(fun)) {} template <class... Args> decltype(auto) operator()(Args&&... args) { return fun_(std::ref(*this), std::forward<Args>(args)...); } }; template <class Fun> decltype(auto) y_combinator(Fun&& fun) { return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun)); } /* Example auto fun = y_combinator([&](auto self, int x) -> void { self(x + 1); }); */ } // namespace std void solve() { vector<int> l(3), r(3); cin >> r[0] >> r[1] >> r[2]; l[0] = l[1] = l[2] = 1; int q; cin >> q; auto ask = [&] (int x, int y, int z) { cout << "? " << x << " " << y << " " << z << endl; int res; cin >> res; return res; }; auto guess = [&] (int x, int y, int z) { cout << "! " << x << " " << y << " " << z << endl; }; auto get = [&] () { int idx = 0; for (int i = 1; i < 3; i++) if (r[i] - l[i] > r[idx] - l[idx]) idx = i; return idx; }; while (true) { // for (int i = 0; i < 3; i++) { // cout << l[i] << " " << r[i] << endl; // } // cout << "$\n"; int tmp = get(); if (r[tmp] - l[tmp] == 0) { guess(l[0], l[1], l[2]); return; } int mid = (l[tmp] + r[tmp]) / 2; int oldL = l[tmp], oldR = r[tmp]; l[tmp] = mid; r[tmp] = mid + 1; // compare mid and mid + 1 int maximumValue = 0; int side = 0; // cout << tmp << "#\n"; vector<int> x(3); for (x[0] = l[0]; x[0] <= r[0]; x[0]++) for (x[1] = l[1]; x[1] <= r[1]; x[1]++) for (x[2] = l[2]; x[2] <= r[2]; x[2]++) { int res = ask(x[0], x[1], x[2]); if (res > maximumValue) { maximumValue = res; if (x[tmp] == mid) side = 1; else side = 2; } } assert(side != 0); l[tmp] = oldL; r[tmp] = oldR; if (side == 1) r[tmp] = mid; else l[tmp] = mid + 1; } } int32_t main() { // ios_base::sync_with_stdio(0); // cin.tie(0); int t = 1; // cin >> t; while (t--) { 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...