QOJ.ac

QOJ

Límite de tiempo: 2.0 s Límite de memoria: 512 MB Puntuación total: 100 Hackeable ✓

#16845. Beaver Dam

Estadísticas

这是一个交互式问题。

海狸大坝是一个由 $n \times m$ 个网格组成的矩形,某些相邻网格之间有秘密通道供海狸移动。大坝有 $k$ 个出口——即矩形中可以游出大坝的网格。

科学家们正试图了解海狸大坝的结构。他们已经确定了它的布局——确切地知道哪些相邻网格之间有通道。还已知通道构成的图是一棵树——这意味着任何两个网格之间都有且仅有一条通过通道的路径,且每个网格最多只被访问一次。不幸的是,科学家们还无法了解太多关于出口的信息——他们只知道 $k \ge 1$,这意味着大坝中至少有一个出口。

为了找到大坝的出口,科学家们决定使用测试海狸。海狸是聪明的动物,它们完美地了解自己大坝的布局,包括所有出口的位置。由于科学家们只剩下几只海狸用于测试,他们最多只能进行 $48$ 次实验。

实验过程如下。科学家们将两只海狸分别放入矩形大坝的网格 $(i_1, j_1)$ 和 $(i_2, j_2)$ 中。之后,每只海狸都会通过通道游向最近的出口。一切发生得非常快,因此科学家只能确定哪只海狸更快到达出口。如果两只海狸同时到达出口,实验结果是未定义的——这意味着第一只或第二只海狸都有可能先到达。

科学家们需要从内部研究海狸大坝,因此他们需要发现大坝的至少一个出口。请帮助他们找到它。

交互

在开始时,你的程序需要读取测试参数。

第一行包含两个整数 $n, m$——大坝的尺寸($2 \le n, m \le 10^6$;$4 \le n \cdot m \le 10^6$)。

接下来的 $n$ 行包含长度为 $m - 1$ 的由 01 组成的字符串 $h_i$,描述大坝中的水平通道:如果 $h_{i,j} = 1$,则网格 $(i, j)$ 和 $(i, j + 1)$ 之间有一条直接通道。

接下来的 $n - 1$ 行包含长度为 $m$ 的由 01 组成的字符串 $v_i$,描述大坝中的垂直通道:如果 $v_{i,j} = 1$,则网格 $(i, j)$ 和 $(i + 1, j)$ 之间有一条直接通道。

然后,你的程序与裁判程序进行交互,进行查询并接收实验结果。你最多可以执行 $48$ 次题目描述中说明的查询操作。

要进行询问,请输出格式为 ? i1 j1 i2 j2 的字符串,之后 $2$ 只海狸将被放入大坝的指定点 $(i_1, j_1)$ 和 $(i_2, j_2)$。必须满足条件 $1 \le i_1, i_2 \le n$ 且 $1 \le j_1, j_2 \le m$。

作为响应,裁判程序会输出:

  • 1,如果第一只海狸到达出口的时间不晚于第二只海狸;
  • 2,如果第二只海狸到达出口的时间不晚于第一只海狸;
  • 如果海狸同时到达出口,则输出上述两个判定中的任意一个。

要输出问题的答案,请输出字符串 ! i j,其中 $i$ 和 $j$ 应为其中一个出口所在的行号和列号。此输出不计入查询次数。如果大坝中有多个出口,你可以输出其中任意一个。之后,交互器将输出判定——如果你的猜测正确,则输出 Win,否则输出 Lose。如果你的答案不正确,你的程序将获得 WA(Wrong Answer)判定并终止。为了避免获得不正确的判定,如果你的程序收到输出答案不正确的信息,也应当立即终止。

如果在任何时候你的程序超过了 $48$ 次查询的限制,你的程序将以 WA 判定终止。

在你的程序的每次操作之后,请输出一个换行符。

在你的程序的每次操作之后,请清空(flush)输出流。

如果你在 Pascal 中使用 writeln,在 C++ 中使用 cout << ... << endl,在 Java 中使用 System.out.println,在 Python 中使用 print,在 C# 中使用 Console.WriteLine,则输出流会自动清空,不需要额外操作。如果你使用其他输出方法,建议手动清空输出流。

请注意,在此问题中,交互器可能是自适应的(adaptive),这意味着迷宫的状态始终与已进行的查询相符,但在执行过程中可能会发生改变。

样例

输入样例 1

2 3
10
01
111

1

2

1

2

Win

输出样例 1

? 1 1 1 2

? 1 3 2 1

? 1 2 2 3

? 1 2 2 3

! 2 2

说明

在题目的样例中,迷宫如下所示:

也就是说,大坝的出口位于点 $(1, 1)$ 和 $(2, 2)$。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.