QOJ.ac

QOJ

时间限制: 1 s 内存限制: 256 MB 总分: 100

#23830. 现代宅邸

统计

题目描述

你迷路闯入了一座巨大的宅邸。这座宅邸的结构是正方形的房间在东西南北方向上呈网格状排列,东西方向有 $M$ 列,南北方向有 $N$ 行,共有 $M \times N$ 个房间。从西往东数第 $x$ 列($1 \le x \le M$)、从南往北数第 $y$ 行($1 \le y \le N$)的房间表示为 $(x, y)$。

在东西南北方向上相邻的任意 $2$ 个房间之间,都由墙壁中央的一扇门相连。每扇门都处于关闭而无法通行的状态,或打开而可以通行的状态之一。当门打开时,在这些房间的中央之间移动需要花费 $1$ 分钟。此外,部分房间的中央设有一个开关,持续按住开关 $1$ 分钟,宅邸内所有门的开关状态都会反转。

现在,连接东西方向相邻的 $2$ 个房间的所有门都是关闭的,连接南北方向相邻的 $2$ 个房间的所有门都是打开的。你现在位于房间 $(1, 1)$ 的中央,希望用最短的时间移动到房间 $(M, N)$ 的中央。

任务

给定宅邸的大小 $M, N$ 以及设有开关的 $K$ 个房间的位置 $(X_1, Y_1), (X_2, Y_2), \dots, (X_K, Y_K)$,请编写一个程序,求出从连接东西方向相邻的 $2$ 个房间的所有门关闭、连接南北方向相邻的 $2$ 个房间的所有门打开的状态开始,从房间 $(1, 1)$ 的中央移动到房间 $(M, N)$ 的中央最少需要多少分钟。但是,如果无法到达房间 $(M, N)$,请指出这一点。

限制

  • $2 \le M \le 100000$:宅邸在东西方向上的房间个数。
  • $2 \le N \le 100000$:宅邸在南北方向上的房间个数。
  • $1 \le K \le 200000$:设有开关的房间个数。
  • $1 \le X_i \le M$:设有开关的房间在东西方向上的位置。
  • $1 \le Y_i \le N$:设有开关的房间在南北方向上的位置。

输入格式

从标准输入读入以下数据。

  • 第 $1$ 行包含以空格分隔的整数 $M, N, K$。$M$ 表示宅邸在东西方向上的房间个数,$N$ 表示宅邸在南北方向上的房间个数,$K$ 表示设有开关的房间个数。
  • 接下来的 $K$ 行中的第 $i$ 行($1 \le i \le K$)包含以空格分隔的整数 $X_i, Y_i$。这表示在房间 $(X_i, Y_i)$ 的中央设有一个开关。$K$ 个二元组 $(X_1, Y_1), (X_2, Y_2), \dots, (X_K, Y_K)$ 互不相同。

输出格式

向标准输出打印 $1$ 行,包含一个整数,表示移动所需的最少分钟数。但是,如果无法到达房间 $(M, N)$,则改为输出整数 $-1$。

评分标准

  • 在占总分 $20\%$ 的评测数据中,满足 $M \le 1000$ 且 $N \le 1000$。
  • 在占总分 $30\%$ 的评测数据中,满足 $K \le 2000$。
  • 在占总分 $50\%$ 的评测数据中,至少满足上述 $2$ 个条件之一。此外,不存在同时满足上述 $2$ 个条件的评测数据。

样例 1

输入

3 2 1
1 2

输出

4

样例解释

在这个样例中,通过以下行动可以在 $4$ 分钟内从房间 $(1, 1)$ 的中央移动到房间 $(3, 2)$ 的中央,且这是最短时间:

  • 移动到房间 $(1, 2)$ 的中央。
  • 按下房间 $(1, 2)$ 中央的开关。
  • 移动到房间 $(2, 2)$ 的中央。
  • 移动到房间 $(3, 2)$ 的中央。

此过程中宅邸的状态如下图所示。在图中,右方为东,上方为北,$\times$ 记号表示你的位置,$\bigcirc$ 记号表示开关。

fig1

样例 2

输入

3 2 1
2 1

输出

-1

样例解释

在这个样例中,你无法到达房间 $(3, 2)$。

样例 3

输入

8 9 15
3 1
3 2
3 7
3 8
1 1
4 5
4 3
5 6
5 8
6 3
6 2
7 5
8 9
8 6
8 5

输出

25

样例解释

在这个样例中,宅邸的初始状态如下图所示。注意房间 $(1, 1)$ 或房间 $(M, N)$ 的中央也有可能设有开关。

fig2

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.