CF788D Finding lines

题目描述

在参加了一场编程竞赛之后,Roma 决定尝试一下旅游。他的祖国 Uzhlyandia 可以看作是一个笛卡尔平面。他希望沿着 Uzhlyandia 的每一条“主直线”行走。已知这些主直线都是与坐标轴平行的直线(即方程为 $x=a$ 或 $y=a$,其中 $a$ 是该直线的坐标,是一个整数)。 Roma 丢失了自己的地图,所以他需要先找出所有主直线的坐标。Anton 叔叔同意帮助他,帮助规则如下: - 一开始,Roma 并不知道有多少条竖直直线、多少条水平直线,以及它们的坐标; - Roma 可以指定 Uzhlyandia 平面上某个点的整数坐标,Anton 叔叔会告知他这个点到所有主直线的距离中的最小值。不过,由于主直线坐标的绝对值不超过 $10^{8}$,Roma 选择的点的坐标,绝对值同样不能超过 $10^{8}$。 Anton 叔叔要赶去参加 UOI(Uzhlyandian Olympiad in Informatics),所以他只会回答不超过 $3 \cdot 10^{5}$ 个问题。 问题在于 Roma 不知道该如何确定这些直线的坐标。请编写一个程序来模拟 Roma,通过询问找到这些直线的所有坐标。

输入格式

本题初始时没有输入。你的程序需要主动发起询问来获取信息。 保证水平直线和竖直直线的数量均不少于 $1$,且不超过 $10^4$。

输出格式

如需发起一次询问,请输出一行 "0 x y"(其中 $-10^{8} \leq x,y \leq 10^{8}$),代表询问点 $(x, y)$。每次询问后需要输出换行并“刷新”,然后读取该点到所有主直线的最小距离(整数)作为回应。 最多允许 $3 \cdot 10^{5}$ 次询问。 当你准备好输出答案时,需依次输出三行: 1. 第一行输出 "1 n m",其中 $n$ 表示竖直主直线(平行于 $OY$)的数量,$m$ 表示水平主直线(平行于 $OX$)的数量。 2. 第二行输出 $n$ 个整数 $x_1, x_2, ..., x_n$,为所有竖直主直线的坐标。 3. 第三行以同样格式输出 $m$ 个整数 $y_1, y_2, ..., y_m$,为所有水平主直线的坐标。 输出中坐标顺序可以任意。 “刷新”操作,在输出询问语句和换行之后立即调用: - C++ 用 fflush(stdout); - Java 用 System.out.flush(); - Python 用 stdout.flush(); - Pascal 用 flush(output); - 其它语言请查看相关文档。 若超过了允许的询问次数或格式不合法,你会收到 Wrong Answer(错误答案)。 如果你的程序读取到响应值为 -1,须立即正常退出(如 exit(0))。收到此响应表明你询问次数超限或询问参数非法。若无视此返回,则后续可能收到其它错误判定。

说明/提示

示例测试输入为: `

1 2

2

0 -3

` 最小距离分别为: - 从 $(1,2)$ 到 $x=2$ 的距离; - 从 $(-2,-2)$ 到 $y=-3$ 的距离; - 从 $(5,6)$ 到 $x=2$ 的距离; - 从 $(-2,2)$ 到 $y=0$ 的距离。 由 ChatGPT 5 翻译