#P1194. 推箱入库

    ID: 206 传统题 1000ms 128MiB 尝试: 0 已通过: 0难度: 普及+/提高− ← 上一题 下一题 → 随机一题 上传者: 标签 贪心 模拟 分类讨论
显示设置

推箱入库

题目背景

老仓库是一排细长的货位。货位窄得转身都难,管理员只能在箱子之间侧着身子挪动,箱子一旦被推出去就再也拉不回来。

题目描述

仓库由 nn 个货位排成一排,从左到右编号 11 到 nn。货位里放着 kk 个箱子,第 ii 个箱子一开始放在 sis_i 号货位上,保证 1≤s1<s2<⋯<sk≤n1 \le s_1 < s_2 < \cdots < s_k \le n。管理员一开始站在 pp 号货位上,保证这个货位上没有箱子。

管理员每走一步,可以做下面两件事之一:

  • 走动:走到相邻的一个货位,要求这个货位在仓库里,并且没有箱子;
  • 推箱:如果管理员正前方相邻的那个货位上有箱子,而箱子正前方相邻的那个货位在仓库内且没有箱子,那么管理员向前走一步,箱子同时被推到那个空货位上。

箱子只能被推,不能被拉回来;箱子也不能被推到另一个箱子上,或者推到仓库外面去。

管理员希望最终被箱子占住的货位集合恰好等于给定的目标集合。请你求出他最少需要走多少步。如果无论怎么走都做不到,输出 -1。

输入格式

第一行三个整数 n,k,pn, k, p。

第二行 kk 个递增的整数 s1,s2,…,sks_1, s_2, \dots, s_k,表示箱子的初始位置。

第三行 kk 个递增的整数 t1,t2,…,tkt_1, t_2, \dots, t_k,表示目标集合。

输出格式

输出一行一个整数,表示最少步数;如果做不到则输出 -1。

输入输出样例 #1

输入 #1

8 2 4
2 7
1 7

输出 #1

2

输入输出样例 #2

输入 #2

8 2 4
2 7
2 8

输出 #2

3

输入输出样例 #3

输入 #3

8 2 4
2 7
1 5

输出 #3

-1

说明

样例解释

三个样例的初始局面相同:两只箱子分别在 22 号和 77 号货位上,管理员站在 44 号货位上。

  • 样例 1 的目标是让箱子落在 11 号、77 号货位。管理员退到 33 号货位,再把 22 号货位上的箱子推到 11 号货位,一共 22 步。
  • 样例 2 的目标是 22 号、88 号货位。管理员走到 66 号货位用 22 步,再把 77 号货位上的箱子推到 88 号货位,一共 33 步。
  • 样例 3 要求 77 号货位上的箱子落到 55 号货位,这必须由管理员站在箱子右侧把它向左推。但管理员被这只箱子挡在左边,两只箱子之间的空隙又不允许他从旁边绕过去,所以他永远到不了箱子的右侧;如果改从左边把它往右推,箱子只会离 55 号货位越来越远。

数据范围

测试点编号 nn kk 特殊性质
1∼81 \sim 8 ≤12\le 12 ≤3\le 3 无
9∼149 \sim 14 ≤5000\le 5000 ≤100\le 100
15∼2015 \sim 20 ≤106\le 10^6 ≤105\le 10^5

对于 100%100\% 的数据:1≤n≤1061 \le n \le 10^6,1≤k≤1051 \le k \le 10^5,1≤p≤n1 \le p \le n,pp 与所有 sis_i 都不相同,目标集合中的 kk 个货位互不相同。