結果
問題 | No.3018 目隠し宝探し |
ユーザー |
![]() |
提出日時 | 2025-01-25 14:43:15 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 536 ms / 2,000 ms |
コード長 | 1,089 bytes |
コンパイル時間 | 231 ms |
コンパイル使用メモリ | 82,444 KB |
実行使用メモリ | 171,228 KB |
平均クエリ数 | 2.59 |
最終ジャッジ日時 | 2025-01-25 23:28:00 |
合計ジャッジ時間 | 6,764 ms |
ジャッジサーバーID (参考情報) |
judge11 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 21 |
ソースコード
from math import isqrt from collections import defaultdict H, W = map(int, input().split()) def question(h, w): if (h, w) in memo: return memo[(h, w)] print("?", h, w) ans = int(input()) if (h, w) not in memo: memo[(h, w)] = ans return ans def answer(h, w): print("!", h, w) memo = dict() if H == 1 or W == 1: if H == 1 and W == 1: answer(1, 1) elif H == 1: ans = question(1, 1) answer(1, 1+isqrt(ans)) else: ans = question(1, 1) answer(1+isqrt(ans), 1) exit() dist = [[i**2+j**2 for j in range(W)] for i in range(H)] D = defaultdict(list) for i in range(H): for j in range(W): D[dist[i][j]].append((i, j)) d = question(1, 1) if len(D[d]) == 1: h, w = D[d][0] answer(1+h, 1+w) else: d2 = question(2, 1) diff = abs(d2-d) if diff != 1: ansH = 1+diff//2+1 else: if d < d2: ansH = 1 else: ansH = 2 for h, w in D[d]: if h+1 == ansH: ansW = 1+w break answer(ansH, ansW)