Description
有 N 个广播站,分别是 s1,s2,…,sN,它们位于一条直线上。广播站 si 的位置是正整数 xi。你需要为每个广播站 si 分配广播信号的范围 ri。当广播站 si 进行广播时,距离 si 不超过 ri 的广播站可以接收到 si 的广播信号。换句话说,如果广播站 sj 位于闭区间 [xi−ri,xi+ri] 内,那么 sj 就能接收到 si 的广播信号。
广播站 si 的广播可以通过 h−1(h>1) 个其他广播站传递给广播站 sj。也就是说,存在广播站 si1,si2,…,sih−1,使得 si 的广播传递给 si1,每个 sik 再传递给 sik+1,最后 sih−1 传递给 sj,这样 si 的广播在 h 次传递内就可以到达 sj。当然,当 h=1 时,表示 si 的广播直接传递给 sj。在这些情况下,我们称 si 的广播在 h 步内传递到了 sj。
我们希望选择一个广播站作为 h-集中站。这个广播站不进行广播,但必须能够在最多 h 步内接收到其他所有广播站的广播。我们可以将 h-集中站的广播信号范围设为 0。
当为每个广播站 si 分配广播范围 ri 时,分配成本定义为广播范围的平方和。也就是说,成本为 ∑i=1Nri2。我们将以最小化这个成本来分配广播范围。如果广播站 s 作为 h-集中站时的最小分配成本为 Ch∗(s),那么问题的目标就是在所有可能的 h-集中站 s 中,找到具有最小 Ch∗(s) 的那个,以及给出导致该最小成本的广播范围分配。
给定 N 个广播站的位置,对于每个 h=1,2,…,N−1,编写一个程序,输出所有可能的 h-集中站 s 的最小分配成本 Ch∗(s) 中的最小值。
例如,下面的图 1 和图 2 是 5 个广播站 s1,…,s5,它们分别位于坐标 1,3,4,6,9,当 h=2 时的情况。

在图 1 中,当为 s1,s2,s3,s4 分别分配广播范围 3,1,5,2,且 s5 作为 2-集中站时,最小成本为 39。

在图 2 中,当为 s1,s2,s4,s5 分别分配广播范围 2,1,2,3,且 s3 作为 2-集中站时,最小成本为 18。
因此,18 是所有可能的 2-集中站的最小成本中的最小值。
你需要为管理员实现以下一个函数:
void stations(int N, int X[]);
接受广播站的数量 N 和每个广播站的位置 X[0..N-1] 作为参数。其中,X[] 是大小为 N 的向量(vector),X[i] 的值互不相同,且按升序存储。
你需要在 stations() 函数中使用以下函数来提交答案:
void answer(long long Y[]);
这是一个提交大小为 N - 1 的向量 Y[] 的函数。对于 i=0,…,N−2,Y[i] 的值是所有可能的 (i+1)-集中站的最小成本的最小值。这个函数必须在 stations() 函数中且只能被调用一次。
该函数必须按照上述描述进行操作。当然,你可以创建和使用其他函数,但不得进行任何输入输出操作或访问其他文件。
示例评测程序按照以下格式读取输入:
- 第 1 行:N,其中 N 表示广播站的数量
- 第 2 行:N 个整数 x1x2⋯xN,其中 xi 为广播站的位置
示例评测程序对于每个 i=1,…,N−1,在第 i 行输出所有可能的 i-集中站的最小成本的最小值。
3
1 3 8
29
29
5
1 3 4 6 9
39
18
18
18
Hint
数据范围
对于所有输入数据,满足:
- 2≤N≤120
- 1≤x1<x2<⋯<xN≤108
详细子任务附加限制及分值如下表所示。
| 子任务 |
分值 |
约束 |
| 1 |
11 |
N≤7 |
| 2 |
21 |
N≤30 |
| 3 |
17 |
N≤60 |
| 4 |
51 |
无附加限制 |