CF1922C Closest Cities

题目描述

有 $n$ 个城市位于数轴上,第 $i$ 个城市位于点 $a_i$。城市的坐标按升序给出,即 $a_1 < a_2 < \dots < a_n$。 两个城市 $x$ 和 $y$ 之间的距离为 $|a_x - a_y|$。 对于每个城市 $i$,我们定义最近的城市 $j$ 为:从城市 $i$ 到城市 $j$ 的距离不大于从 $i$ 到任意其他城市 $k$ 的距离。例如,如果城市位于点 $[0, 8, 12, 15, 20]$,则: - 城市 $1$ 最近的城市是城市 $2$; - 城市 $2$ 最近的城市是城市 $3$; - 城市 $3$ 最近的城市是城市 $4$; - 城市 $4$ 最近的城市是城市 $3$; - 城市 $5$ 最近的城市是城市 $4$。 这些城市的位置保证了每个城市的最近城市是唯一的。例如,城市位于 $[1, 2, 3]$ 时是不允许的,因为城市 $2$ 有两个最近的城市($1$ 和 $3$,距离都是 $1$)。 你可以在城市之间旅行。假设你当前在城市 $x$,你可以执行以下操作之一: - 以 $|a_x - a_y|$ 个金币的代价,前往任意其他城市 $y$; - 以 $1$ 个金币的代价,前往距离 $x$ 最近的城市。 现在给定 $m$ 个询问。每个询问给定两个城市,你需要计算从一个城市到另一个城市所需花费的最少金币数。

输入格式

第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。 每个测试用例包含以下内容: - 第一行包含一个整数 $n$($2 \le n \le 10^5$); - 第二行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$($0 \le a_1 < a_2 < \dots < a_n \le 10^9$); - 第三行包含一个整数 $m$($1 \le m \le 10^5$); - 接下来 $m$ 行,每行包含两个整数 $x_i$ 和 $y_i$($1 \le x_i, y_i \le n$,$x_i \ne y_i$),表示第 $i$ 个询问需要你计算从城市 $x_i$ 到城市 $y_i$ 的最小花费。 输入的额外限制: - 每个测试用例中,每个城市的最近城市都是唯一确定的; - 所有测试用例中 $n$ 的总和不超过 $10^5$; - 所有测试用例中 $m$ 的总和不超过 $10^5$。

输出格式

对于每个询问,输出一个整数,表示所需花费的最少金币数。

说明/提示

我们来看题目描述中的前两个样例询问: - 第一个询问,你最初在城市 $1$。你可以依次前往最近的城市(城市 $2$),花费 $1$ 个金币,再前往最近的城市(城市 $3$),再花费 $1$ 个金币,再前往最近的城市(城市 $4$),再花费 $1$ 个金币。总共花费 $3$ 个金币,从城市 $1$ 到城市 $4$。 - 第二个询问,你可以用同样的方法从城市 $1$ 到城市 $4$,然后再花费 $5$ 个金币从城市 $4$ 到城市 $5$。 由 ChatGPT 4.1 翻译