結果
| 問題 |
No.3161 Find Presents
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-05-05 20:40:24 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,386 bytes |
| コンパイル時間 | 414 ms |
| コンパイル使用メモリ | 12,348 KB |
| 実行使用メモリ | 28,024 KB |
| 平均クエリ数 | 1.00 |
| 最終ジャッジ日時 | 2025-05-05 21:12:13 |
| 合計ジャッジ時間 | 8,550 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | WA * 80 |
ソースコード
#!/usr/bin/env python3
# GPT Interactive solution : 2-D rectangle queries (≤ 8000) to locate ≤ 100 points (0-1e6)
import sys
from collections import deque
# ----- parameters ------------------------------------------------------------
COORD_MIN = 0
COORD_MAX = 1_000_000
QUERY_LIMIT = 8000
# -----------------------------------------------------------------------------
query_cnt = 0 # 送信した質問数
points = [] # 発見した (x, y)
# ──────────────────────────────────────────────────────────────────────────────
def ask(x1: int, x2: int, y1: int, y2: int) -> bool:
"""
1 回質問する.矩形 [x1,x2] × [y1,y2] 内に点が存在すれば True を返す.
ジャッジが -1 を返した場合は即座に exit(0) する.
"""
global query_cnt
if query_cnt >= QUERY_LIMIT:
sys.exit(0) # これ以上質問するとペナルティなので強制終了
print(x1, x2, y1, y2, flush=True)
query_cnt += 1
try:
resp = int(sys.stdin.readline())
except Exception:
sys.exit(0) # 想定外の入力 ⇒ 終了
if resp == -1: # 不正クエリ / 回数超過
sys.exit(0)
return resp == 1 # 1 → 存在する, 0 → 無い
# ──────────────────────────────────────────────────────────────────────────────
def main() -> None:
# 最初の矩形 ([全域]) に点が存在するのは制約 N ≥ 1 で保証されているので,
# 根ノードの存在判定クエリは不要.
q: deque[tuple[int, int, int, int]] = deque()
q.append((COORD_MIN, COORD_MAX, COORD_MIN, COORD_MAX))
while q:
x1, x2, y1, y2 = q.pop()
# 既に一点に絞られたら記録
if x1 == x2 and y1 == y2:
points.append((x1, y1))
# 100 個そろえば終了してもよいが,キューが空になるまで走らせても
# 問題ない(重複座標は無いことが保証されている)
continue
# どちらの辺が長いかで分割方向を決定
if (x2 - x1) >= (y2 - y1):
xm = (x1 + x2) // 2
# 左半分
if ask(x1, xm, y1, y2):
q.append((x1, xm, y1, y2))
# 右半分
if xm + 1 <= x2 and ask(xm + 1, x2, y1, y2):
q.append((xm + 1, x2, y1, y2))
else:
ym = (y1 + y2) // 2
# 下半分
if ask(x1, x2, y1, ym):
q.append((x1, x2, y1, ym))
# 上半分
if ym + 1 <= y2 and ask(x1, x2, ym + 1, y2):
q.append((x1, x2, ym + 1, y2))
# ─── 質問フェーズ終了 ───────────────────────────────────────
print(-1, flush=True) # これ以降は答えの出力
print(len(points), flush=True)
for x, y in points:
print(x, y, flush=True)
if __name__ == "__main__":
main()