题意
2048 年,第三十届 CSP 认证的考场上,作为选手的小明打开了第一题。这个题的样例有 n n n 组数据,数据从 1 ∼ n 1 \sim n 1∼n 编号, i i i 号数据的规模为 a i a_i ai。
小明对该题设计出了一个暴力程序,对于一组规模为 u u u 的数据,该程序的运行时间为 u 2 u^2 u2 。然而这个程序运行完一组规模为 u u u 的数据之后,它将在任何一组规模小于 u u u 的数据上运行错误。样例中的 a i a_i ai 不一定递增,但小明又想在不修改程序的情况下正确运行样例,于是小明决定使用一种非常原始的解决方案:将所有数据划分成若干个数据段,段内数据编号连续,接着将同一段内的数据合并成新数据,其规模等于段内原数据的规模之和,小明将让新数据的规模能够递增。
也就是说,小明需要找到一些分界点 $1 \leq k_1 \lt k_2 \lt \cdots \lt k_p \lt n $,使得
∑ i = 1 k 1 a i ≤ ∑ i = k 1 + 1 k 2 a i ≤ ⋯ ≤ ∑ i = k p + 1 n a i \sum_{i=1}^{k_1} a_i \leq \sum_{i=k_1+1}^{k_2} a_i \leq \cdots \leq \sum_{i=k_p+1}^{n} a_i i=1∑k1ai≤i=k1+1∑k2ai≤⋯≤i=kp+1∑nai
注意 p p p 可以为 0 0 0 且此时 k 0 = 0 k_0 = 0 k0=0,也就是小明可以将所有数据合并在一起运行。
小明希望他的程序在正确运行样例情况下,运行时间也能尽量小,也就是最小化
( ∑ i = 1 k 1 a i ) 2 + ( ∑ i = k 1 + 1 k 2 a i ) 2 + ⋯ + ( ∑ i = k p + 1 n a i ) 2 (\sum_{i=1}^{k_1} a_i)^2 + (\sum_{i=k_1+1}^{k_2} a_i)^2 + \cdots + (\sum_{i=k_p+1}^{n} a_i)^2 (i=1∑k1ai)2+(i=k1+1∑k2ai)2+⋯+(i=kp+1∑nai)2
小明觉得这个问题非常有趣,并向你请教:给定 n n n 和 a i a_i ai ,请你求出最优划分方案下,小明的程序的最小运行时间。
测试点编号 | n ≤ n \leq n≤ | a i ≤ a_i \leq ai≤ | t y p e = type = type= |
---|---|---|---|
1 ∼ 3 1 \sim 3 1∼3 | 10 | 10 | 0 |
4 ∼ 6 4 \sim 6 4∼6 | 50 | 1 0 3 10^3 103 | 0 |
7 ∼ 9 7 \sim 9 7∼9 | 400 | 1 0 4 10^4 104 | 0 |
10 ∼ 16 10 \sim 16 10∼16 | 5000 | 1 0 5 10^5 105 | 0 |
17 ∼ 22 17 \sim 22 17∼22 | 5 × 1 0 5 5 \times 10^5 5×105 | 1 0 6 10^6 106 | 0 |
23 ∼ 25 23 \sim 25 23∼25 | 4 × 1 0 7 4 \times 10^7 4×107 | 1 0 9 10^9 109 | 1 |
对于 t y p e = 0 type=0 type=0的所有测试点,保证最后输出的答案 ≤ 4 × 1 0 18 \leq 4 \times 10^{18} ≤4×1018
所有测试点满足:
t
y
p
e
∈
{
0
,
1
}
,
2
≤
n
≤
4
×
1
0
7
,
1
≤
a
i
≤
1
0
9
,
1
≤
m
≤
1
0
5
,
1
≤
l
i
≤
r
i
≤
1
0
9
,
0
≤
x
,
y
,
z
,
b
1
,
b
2
<
2
30
type \in \{0,1\},2 \leq n \leq 4 \times 10^7, 1 \leq a_i \leq 10^9,1 \leq m \leq 10^5,1 \leq l_i \leq r_i \leq 10^9,0 \leq x,y,z,b_1,b_2 \lt 2^{30}
type∈{0,1},2≤n≤4×107,1≤ai≤109,1≤m≤105,1≤li≤ri≤109,0≤x,y,z,b1,b2<230
题解
思路比较巧妙的题(显然我是不会的)。
如果DP记录的状态是当前的最小代价,则转移时不可避免地要判大小,这样又要多记一维最后一段的起点来算最后一段的和,而直接贪心又不太行(考场上想到自闭)。
考虑能否把最后一段的和与最小总代价合在一起,结合直观的感受:每段尽量小,可以猜想最后一段最小对应总代价最小,又容易证明其正确性:对前面和后面都是最优,于是DP状态就只有一维,转移时单调队列优化即可。
用两个long long来记答案,要卡一下空间。