CF343C Read Time
题目描述
疯狂科学家 Mike 从不用慢速硬盘。他改造的硬盘上不仅有一个,而是有 $n$ 个不同的读写头,可以并行读取数据。
从侧面看,Mike 的硬盘是一个无限的磁道数组。磁道自左至右用正整数编号,从 1 开始。初始时,第 $i$ 个读写头位于编号为 $h_i$ 的磁道上。对于每个读写头,硬盘固件每秒可以将其向左或向右移动一格,或保持在原来的磁道。每个读写头的移动互不影响,读写头之间可以交换相对顺序;同一个磁道上可以有多个读写头。只要有至少一个读写头访问过某个磁道,该磁道就被认为已读取。特别地,所有编号为 $h_1, h_2, \dots, h_n$ 的磁道在操作开始时已经被读取。
Mike 需要读取编号为 $p_1, p_2, \dots, p_m$ 的 $m$ 个不同的磁道。请你确定,最少需要多少秒,硬盘的固件能够移动读写头并读取所有这些指定的磁道。注意,允许读写其它任意数量的磁道。
输入格式
输入的第一行包含两个用空格分隔的整数 $n,m$($1 \leq n,m \leq 10^5$),分别表示读写头的数量以及需要读取的磁道数量。第二行包含 $n$ 个递增的不同整数 $h_i$($1 \leq h_i \leq 10^{10}$,$h_i < h_{i+1}$),表示每个读写头的初始位置。第三行包含 $m$ 个递增的不同整数 $p_i$($1 \leq p_i \leq 10^{10}$,$p_i < p_{i+1}$),表示需要读取的磁道编号。
请勿在 C++ 中使用 %lld 格式符读取或输出 64 位整数,建议使用 cin、cout 流或 %I64d 格式符。
输出格式
输出一个整数,表示读取所有需要的磁道所需的最短秒数。
说明/提示
第一个测试样例与上图一致。在这种情况下,可以用如下方式在 2 秒内完成读取:
1. 第 1 秒,让第 1 个读写头向左移动,并保持在那里;
2. 让第 2 个读写头向左移动两次;
3. 让第 3 个读写头向右移动两次(注意第 6 号磁道一开始已被读取)。
无法在 1 秒内完成全部读取,因为第 3 个头距离第 8 号磁道有 2 格。
由 ChatGPT 5 翻译