Submission #124774

#TimeUsernameProblemLanguageResultExecution timeMemory
124774tutisWorm Worries (BOI18_worm)C++17
100 / 100
1006 ms5496 KiB
/*input 1000 1000 1 4000 8 6 2 1 5 6 9 4 5 2 3 5 4 8 1 11 1 1 156 64 456 56 4321 321 56156 564 564 6 1 11 1 1 1 11 1 1 15 1 51 156 5156 11 1 1 11 1 1 14 1 1 11 1 11 1 1 1 1 11 1 1 1 15 5 5 3 3 3 3 6 6 61 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 5 5 6 6 68 8 84 4 456 */ #include <stdio.h> #include <stdlib.h> #include <bits/stdc++.h> using namespace std; int N, M, K, Q; map<tuple<int, int, int>, int>MAPPPAS; map<int, int>G; int timer = 2; int mxxx = -1; int x3 = 1; int y3 = 1; int query(int x, int y, int z) { if (x <= 0 || x > N || y <= 0 || y > M || z <= 0 || z > K) return 0; if (MAPPPAS.count(make_tuple(x, y, z))) return MAPPPAS[make_tuple(x, y, z)]; printf("? %d %d %d\n", x, y, z); fflush(stdout); int ans = -1; ans = timer; timer += 5; if (rand() % 5 == 0) ans -= 18; (void)scanf("%d", &ans); if (ans >= mxxx) { mxxx = ans; x3 = x; y3 = y; } if (ans == -1) exit(0); G[x] = ans; return MAPPPAS[make_tuple(x, y, z)] = ans; } void guess(int x, int y, int z) { if (query(x + 1, y, z) > query(x, y, z)) return guess(x + 1, y, z); if (query(x - 1, y, z) > query(x, y, z)) return guess(x - 1, y, z); if (query(x, y + 1, z) > query(x, y, z)) return guess(x, y + 1, z); if (query(x, y - 1, z) > query(x, y, z)) return guess(x, y - 1, z); if (query(x, y, z + 1) > query(x, y, z)) return guess(x, y, z + 1); if (query(x, y, z - 1) > query(x, y, z)) return guess(x, y, z - 1); printf("! %d %d %d\n", x, y, z); cerr << MAPPPAS.size() << endl; exit(0); } void spresk1() { int l = 1; int r = N; while (r - l + 1 >= 5) { int m1 = l + (r - l) * 0.37; int m2 = max(m1 + 1, r - (m1 - l)); auto it = G.upper_bound(l); if (it != G.end() && it->first < r) { int m = it->first; if (m >= (l + r) / 2) { m2 = m; } else { m1 = m; } } //cout << l << " " << m1 << " " << m2 << " " << r << endl; if (query(m1, 1, 1) >= query(m2, 1, 1)) r = m2 - 1; else l = m1 + 1; } guess(l, 1, 1); } void spresk2(int x1, int x2, int y1, int y2) { if (x2 - x1 >= y2 - y1) { int x = (x1 + x2) / 2; pair<int, int>mx = { -1, -1}; for (int y = y1; y <= y2; y++) mx = max(mx, {query(x, y, 1), y}); int y = mx.second; query(x + 1, y, 1); query(x - 1, y, 1); query(x, y - 1, 1); query(x, y + 1, 1); if (x3 > x) return spresk2(x + 1, x2, y1, y2); if (x3 < x) return spresk2(x1, x - 1, y1, y2); guess(x3, y3, 1); } else { int y = (y1 + y2) / 2; pair<int, int>mx = { -1, -1}; for (int x = x1; x <= x2; x++) mx = max(mx, {query(x, y, 1), x}); int x = mx.second; query(x + 1, y, 1); query(x - 1, y, 1); query(x, y - 1, 1); query(x, y + 1, 1); if (y3 > y) return spresk2(x1, x2, y + 1, y2); if (y3 < y) return spresk2(x1, x2, y1, y - 1); guess(x3, y3, 1); } } void Random() { int mx = -1; int x = 1, y = 1, z = 1; for (int gal = 0; gal < Q / 2; gal++) { int a = (rand() % N) + 1; int b = (rand() % M) + 1; int c = (rand() % K) + 1; if (query(a, b, c) >= query(x, y, z)) { mx = query(a, b, c); x = a; y = b; z = c; } } guess(x, y, z); } int main() { srand(clock()); (void)scanf("%d %d %d %d", &N, &M, &K, &Q); if (M == 1 && K == 1) spresk1(); if (K == 1) spresk2(1, N, 1, M); Random(); }

Compilation message (stderr)

worm.cpp: In function 'void Random()':
worm.cpp:127:6: warning: variable 'mx' set but not used [-Wunused-but-set-variable]
  int mx = -1;
      ^~
worm.cpp: In function 'int query(int, int, int)':
worm.cpp:29:2: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  (void)scanf("%d", &ans);
  ^~~~~~~~~~~~~~~~~~~~~~~
worm.cpp: In function 'int main()':
worm.cpp:147:2: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  (void)scanf("%d %d %d %d", &N, &M, &K, &Q);
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...