Logo HelloWorld信息学奥赛题库

少儿编程

时间限制:1 s 空间限制:256 MB

#3573. 「JOI 2013 Final」 现代豪宅

统计

题目描述

题目译自 JOI 2013 Final T3「現代的な屋敷

你在某个很大的豪宅里迷路了。这个豪宅由东西方向 $ M $ 列,南北方向 $ N $ 行的正方形房间组成。从西面开始第 $ x $ 列 $ (1 \leq x \leq M) $ ,从南面开始第 $ y $ 行 $ (1 \leq y \leq N) $ 的房间用 $ (x,y) $ 表示。

相邻的两个房间之间都有一扇门。对于每扇门,门关上表示不可通行,门打开表示可以通行。当门打开时,从门一边的房间走到另一边的房间需要 $ 1 $ 分钟。另外,一些房间中有一个开关,如果连续 $ 1 $ 分钟按住这个开关,那么所有关上的门会打开,所有打开的门会关闭。

现在,连接东西两个房间的门全都是关上的,连接南北两个房间的门全都是打开的。你现在在房间 $ (1,1) $ ,要在最短时间内移动到房间 $ (M,N) $ 。

任务

给出豪宅的大小 $ M,N $ ,以及存在开关的 $ K $ 个房间的位置 $ (X_1,Y_1),(X_2,Y_2), \ldots ,(X_K,Y_K) $ 。开始时,连接东西两个房间的门全都是关上的,连接南北的两个房间全都是打开的。请编写程序求出从房间 $ (1,1) $ 移动到房间 $ (M,N) $ 最少需要多少时间。不过,当房间 $ (M,N) $ 不能到达时,请输出 $ -1 $ 。

输入格式

输入标准如下:

  • 第一行为三个以空格分开的整数 $ M,N,K $ 。 $ M $ 表示东西方向上房间的个数, $ N $ 表示南北方向上房间的个数, $ K $ 表示存在开关的房间的个数。
  • 接下来 $ K $ 行中的第 $ i $ 行 $ (1 \leq i \leq K) $ 为两个以空格分开的整数 $ X_i,Y_i $ 。表示房间 $ (X_i,Y_i) $ 中存在开关。这 $ K $ 个二元组 $ (X_1,Y_1),(X_2,Y_2),...,(X_K,Y_K) $ 间彼此相异。

输出格式

输出一行一个整数:表示移动所需的最短时间。如果不能到达房间 $ (M,N) $ 则输出 $ -1 $ 。

样例 1

input

3 2 1
1 2

output

4

对于此样例,可以通过以下的行动来在 $ 4 $ 分钟之内从房间 $ (1,1) $ 到达房间 $ (3,2) $ 。这是最短用时。

  1. 移动到房间 $ (1,2) $ 。
  2. 在房间 $ (1,2) $ 中按住开关。
  3. 移动到房间 $ (2,2) $ 。
  4. 移动到房间 $ (3,2) $ 。

以上行动可以用下图表示。图中向右为东,向上为北。图中的 $ × $ 图案表示你所在的位置, $ ○ $ 图案表示开关的位置。

TIM20180812165656.png

样例 2

input

3 2 1
2 1

output

-1

对于此样例,不能到达房间 $ (3,2) $ 。

样例 3

input

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

output

25

初始状态:

TIM20180812200833.png

请注意:房间 $ (1,1) $ 和房间 $ (M,N) $ 中也可能存在开关。

数据范围与提示

对于所有数据,$ 2 \leq M, N \leq 10^5,$ $ 1 \leq K \leq 2×10^5,$ $ 1 \leq X_i \leq M,$ $ 1 \leq Y_i \leq N$。

子任务编号 分值 附加限制
1 20 $M, N \leq 1000$
2 30 $K \leq 2000$
3 50