Submission #544738

#TimeUsernameProblemLanguageResultExecution timeMemory
544738rainboyWorm Worries (BOI18_worm)C11
100 / 100
664 ms336 KiB
/* upsolved after reading analysis */ #include <math.h> #include <stdio.h> #include <stdlib.h> int n, m, l; int query(int i, int j, int k) { int x; printf("? %d %d %d\n", i, j, k), fflush(stdout); scanf("%d", &x); if (x == -1) exit(0); return x; } void answer(int i, int j, int k) { printf("! %d %d %d\n", i, j, k), fflush(stdout); exit(0); } void solve2(int i1, int j1, int i2, int j2, int i3, int j3, int a3, int flip) { int i, j, j_, a_; i = (i1 + i2) / 2; j_ = a_ = -1; for (j = j1; j <= j2; j++) { int a = !flip ? query(i, j, 1) : query(j, i, 1); if (a_ < a) a_ = a, j_ = j; } if (a_ < a3) { if (i3 < i) solve2(j1, i1, j2, i - 1, j3, i3, a3, flip ^ 1); else solve2(j1, i + 1, j2, i2, j3, i3, a3, flip ^ 1); } else if (i > i1 && a_ < (!flip ? query(i - 1, j_, 1) : query(j_, i - 1, 1))) solve2(j1, i1, j2, i - 1, j_, i, a_, flip ^ 1); else if (i < i2 && a_ < (!flip ? query(i + 1, j_, 1) : query(j_, i + 1, 1))) solve2(j1, i + 1, j2, i2, j_, i, a_, flip ^ 1); else if (!flip) answer(i, j_, 1); else answer(j_, i, 1); } int main() { int q; srand(12345); scanf("%d%d%d%d", &n, &m, &l, &q); if (m == 1 && l == 1) { double phi = (1 + sqrt(5)) / 2; int lower, upper, mid, a; lower = 0, upper = n + 1, mid = lower + (int) (upper - lower - 1) / phi + 1, a = query(mid, 1, 1); while (upper - lower > 2) if (mid - lower > upper - mid) { int mid_ = lower + (int) ((mid - lower - 1) / phi) + 1, a_ = query(mid_, 1, 1); if (a < a_) upper = mid, mid = mid_, a = a_; else lower = mid_; } else { int mid_ = upper - (int) ((upper - mid - 1) / phi) - 1, a_ = query(mid_, 1, 1); if (a < a_) lower = mid, mid = mid_, a = a_; else upper = mid_; } answer(mid, 1, 1); } else if (l == 1) solve2(1, 1, n, m, -1, -1, -1, 0); else { int h, i, j, k, a, i_, j_, k_, a_; i_ = j_ = k_ = a_ = -1; for (h = 0; h < q / 2; h++) { i = rand() % n + 1, j = rand() % m + 1, k = rand() % l + 1, a = query(i, j, k); if (a_ < a) a_ = a, i_ = i, j_ = j, k_ = k; } i = i_, j = j_, k = k_, a = a_; while (1) if (i > 1 && a < (a_ = query(i - 1, j, k))) a = a_, i--; else if (i < n && a < (a_ = query(i + 1, j, k))) a = a_, i++; else if (j > 1 && a < (a_ = query(i, j - 1, k))) a = a_, j--; else if (j < m && a < (a_ = query(i, j + 1, k))) a = a_, j++; else if (k > 1 && a < (a_ = query(i, j, k - 1))) a = a_, k--; else if (k < l && a < (a_ = query(i, j, k + 1))) a = a_, k++; else break; answer(i, j, k); } return 0; }

Compilation message (stderr)

worm.c: In function 'query':
worm.c:12:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |  scanf("%d", &x);
      |  ^~~~~~~~~~~~~~~
worm.c: In function 'main':
worm.c:53:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |  scanf("%d%d%d%d", &n, &m, &l, &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...