分割序列
题目描述
给定一个长度为 n 的整数序列 a1,a2,⋯,an ,把这个序列分成 k 个连续的非空子数组,使得每个元素正好属于一个子数组。设 si 是从左到右 i 个子数组中元素的总和,计算每个 1≤k≤n 的最大值。
i=1∑ki×si
更正式地说,对于每个 1≤k≤n ,让 r0=0 和 rk=n ,你需要找到 (k−1) 个整数 r1,r2,⋯,rk−1 ,使得 r0<r1<r2<⋯<rk−1<rk 和最大化
$$\sum\limits_{i = 1}^k i \times (\sum\limits_{j = r_{i - 1} + 1}^{r_i} a_j)$$
输入格式
有多个测试用例。输入的第一行包含一个整数 T ,表示测试用例的数量。对于每个测试用例
第一行包含一个整数 n ( 1≤n≤5×105 ),表示序列的长度。( 1≤n≤5×105 ) 表示序列的长度。
第二行包含 n 个整数 a1,a2,⋯,an ( −106≤ai≤106 ),表示序列。
保证所有测试用例的 n 之和不超过 5×105 。
输出格式
对于每个测试用例,输出一行包含 n 个整数 v1,v2,⋯,vn 并用空格隔开,其中 vi 是 k=i 的答案。
样例 #1
样例输入 #1
2
6
1 3 -4 5 -1 -2
1
100
样例输出 #1
2 4 5 3 1 -2
100
提示
对于第一个示例测试用例,考虑到 k=3 ,我们可以将序列划分为 {{1},{3,−4},{5,−1,−2}} 。答案是 $1 \times 1 + 2 \times (3 - 4) + 3 \times (5 - 1 - 2) = 5$ 。