DTOJ 4655. 「CSP-S 2019」划分

题意

2048 年,第三十届 CSP 认证的考场上,作为选手的小明打开了第一题。这个题的样例有 n n n 组数据,数据从 1 ∼ n 1 \sim n 1n 编号, 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=1k1aii=k1+1k2aii=kp+1nai

注意 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=1k1ai)2+(i=k1+1k2ai)2++(i=kp+1nai)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 1310100
4 ∼ 6 4 \sim 6 4650 1 0 3 10^3 1030
7 ∼ 9 7 \sim 9 79400 1 0 4 10^4 1040
10 ∼ 16 10 \sim 16 10165000 1 0 5 10^5 1050
17 ∼ 22 17 \sim 22 1722 5 × 1 0 5 5 \times 10^5 5×105 1 0 6 10^6 1060
23 ∼ 25 23 \sim 25 2325 4 × 1 0 7 4 \times 10^7 4×107 1 0 9 10^9 1091

对于 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}2n4×1071ai1091m1051liri1090x,y,z,b1,b2<230

题解

思路比较巧妙的题(显然我是不会的)。

如果DP记录的状态是当前的最小代价,则转移时不可避免地要判大小,这样又要多记一维最后一段的起点来算最后一段的和,而直接贪心又不太行(考场上想到自闭)。

考虑能否把最后一段的和与最小总代价合在一起,结合直观的感受:每段尽量小,可以猜想最后一段最小对应总代价最小,又容易证明其正确性:对前面和后面都是最优,于是DP状态就只有一维,转移时单调队列优化即可。

用两个long long来记答案,要卡一下空间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值