题目链接
小 G G 是一个出色的诗人,经常作诗自娱自乐。
但是,他一直被一件事情所困扰,那就是诗的排版问题。
一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的。
小 G G 给每首诗定义了一个行标准长度(行的长度为一行中符号的总个数),他希望排版后每行的长度都和行标准长度相差不远。
显然排版时,不应改变原有的句子顺序,并且小 G G 不允许把一个句子分在两行或者更多的行内。
在满足上面两个条件的情况下,小 G G 对于排版中的每行定义了一个不协调度,为这行的实际长度与行标准长度差值绝对值的 P P 次方,而一个排版的不协调度为所有行不协调度的总和。
小 G G 最近又作了几首诗,现在请你对这几首诗进行排版,使得排版后的诗尽量协调(即不协调度尽量小),并把排版的结果告诉他。
输入格式
第一行包含一个整数 T T ,表示诗的数量,接下来是 T T 首诗,每首诗是一组数据。
每组数据的第一行包含三个整数 N , L N , L 和 P P ,其中 N N 表示这首诗句子的数目,L L 表示这首诗的行标准长度,P P 的含义参考问题描述。
从第二行开始,每行一个句子,句子由英文字母、数字、标点符号等符号组成(ASCII 码 33 ∼ 127 33 ∼ 127 ,但不包含 -
)。
输出格式
对于每组测试数据,若最小的不协调度不超过 10 18 10 18 ,则第一行为一个数,表示不协调度。接下来若干行,表示你排版之后的诗。注意:在同一行的相邻两个句子之间需要用一个空格分开。
如果有多个可行解,它们的不协调度都是最小值,则输出任意一个解均可 。(本题有 special judge)(由于本题数据量大,展示标准答案时,不展示可行解)
若最小的不协调度超过 10 18 10 18 ,则输出 Too hard to arrange
。
每组测试数据结束后输出 --------------------
,共 20 20 个 -
,-
的 ASCII 码为 45 45 ,请勿输出多余的空行或者空格。
数据范围
总共 10 10 个测试点,数据范围满足:
测试点
T T
N N
L L
P P
1 1
≤ 10 ≤ 10
≤ 18 ≤ 18
≤ 100 ≤ 100
≤ 5 ≤ 5
2 2
≤ 10 ≤ 10
≤ 2 × 10 3 ≤ 2 × 10 3
≤ 6 × 10 4 ≤ 6 × 10 4
≤ 10 ≤ 10
3 3
≤ 10 ≤ 10
≤ 2 × 10 3 ≤ 2 × 10 3
≤ 6 × 10 4 ≤ 6 × 10 4
≤ 10 ≤ 10
4 4
≤ 5 ≤ 5
≤ 10 5 ≤ 10 5
≤ 200 ≤ 200
≤ 10 ≤ 10
5 5
≤ 5 ≤ 5
≤ 10 5 ≤ 10 5
≤ 200 ≤ 200
≤ 10 ≤ 10
6 6
≤ 5 ≤ 5
≤ 10 5 ≤ 10 5
≤ 3 × 10 6 ≤ 3 × 10 6
2 2
7 7
≤ 5 ≤ 5
≤ 10 5 ≤ 10 5
≤ 3 × 10 6 ≤ 3 × 10 6
2 2
8 8
≤ 5 ≤ 5
≤ 10 5 ≤ 10 5
≤ 3 × 10 6 ≤ 3 × 10 6
≤ 10 ≤ 10
9 9
≤ 5 ≤ 5
≤ 10 5 ≤ 10 5
≤ 3 × 10 6 ≤ 3 × 10 6
≤ 10 ≤ 10
10 10
≤ 5 ≤ 5
≤ 10 5 ≤ 10 5
≤ 3 × 10 6 ≤ 3 × 10 6
≤ 10 ≤ 10
所有测试点中均满足句子长度不超过 30 30 ,P ≥ 1 P ≥ 1 。
输入样例:
输出样例:
样例解释
前两组输入数据中每行的实际长度均为 6 6 ,后两组输入数据每行的实际长度均为 4 4 。
一个排版方案中每行相邻两个句子之间的空格也算在这行的长度中(可参见样例中第二组数据)。
每行末尾没有空格。
解题思路
四边形不等式优化dp
四边形不等式:对于一个二元函数 w ( x , y ) w ( x , y ) ,对于定义域上的任何四个整个整数 a ≤ b ≤ c ≤ d a ≤ b ≤ c ≤ d ,都有 w ( a , d ) + w ( b , c ) ≥ w ( a , c ) + w ( b , d ) w ( a , d ) + w ( b , c ) ≥ w ( a , c ) + w ( b , d ) ,则称函数 w w 满足四边形不等式
四边形不等式的另外一个等价定义:对于定义域上的任何两个整数 a < b a < b ,都有 w ( a , b + 1 ) + w ( a + 1 , b ) ≥ w ( a , b ) + w ( a + 1 , b + 1 ) w ( a , b + 1 ) + w ( a + 1 , b ) ≥ w ( a , b ) + w ( a + 1 , b + 1 )
证明:
对于 a < c a < c ,则 a < a + 1 ≤ c < c + 1 a < a + 1 ≤ c < c + 1 ,有 w ( a , c + 1 ) + w ( a + 1 , c ) ≥ w ( a , c ) + w ( a + 1 , c + 1 ) w ( a , c + 1 ) + w ( a + 1 , c ) ≥ w ( a , c ) + w ( a + 1 , c + 1 )
对于 a + 1 < c a + 1 < c ,则 a + 1 < a + 2 ≤ c < c + 1 a + 1 < a + 2 ≤ c < c + 1 ,有 w ( a + 1 , c + 1 ) + w ( a + 2 , c ) ≥ w ( a + 1 , c ) + w ( a + 2 , c + 1 ) w ( a + 1 , c + 1 ) + w ( a + 2 , c ) ≥ w ( a + 1 , c ) + w ( a + 2 , c + 1 )
两式相加,得 w ( a , c + 1 ) + w ( a + 2 , c ) ≥ w ( a , c ) + w ( a + 2 , c + 1 ) w ( a , c + 1 ) + w ( a + 2 , c ) ≥ w ( a , c ) + w ( a + 2 , c + 1 )
⋮ ⋮
得对于 a < b < c < c + 1 a < b < c < c + 1 ,w ( a , c + 1 ) + w ( b , c ) ≥ w ( a , c ) + w ( b , c + 1 ) w ( a , c + 1 ) + w ( b , c ) ≥ w ( a , c ) + w ( b , c + 1 )
同理,对于 a < b < c + 1 a < b < c + 1 ,则 a < b < c + 1 < c + 2 a < b < c + 1 < c + 2 ,有 w ( a , c + 2 ) + w ( b , c + 1 ) ≥ w ( a , c + 1 ) + w ( b , c + 2 ) w ( a , c + 2 ) + w ( b , c + 1 ) ≥ w ( a , c + 1 ) + w ( b , c + 2 )
两式相加,得 w ( b , c ) + w ( a , c + 2 ) ≥ w ( a , c ) + w ( b , c + 2 ) w ( b , c ) + w ( a , c + 2 ) ≥ w ( a , c ) + w ( b , c + 2 )
⋮ ⋮
得对于 a < b < c < d a < b < c < d ,w ( b , c ) + w ( a , d ) ≥ w ( a , c ) + w ( b , d ) w ( b , c ) + w ( a , d ) ≥ w ( a , c ) + w ( b , d )
显然,a = b = c = d a = b = c = d 时该式依然成立,故有 对 于 a ≤ b ≤ c ≤ d , 有 w ( a , d ) + w ( b , c ) ≥ w ( a , c ) + w ( b , d ) 对 于 a ≤ b ≤ c ≤ d , 有 w ( a , d ) + w ( b , c ) ≥ w ( a , c ) + w ( b , d ) ,得证
一般证明四边形不等式都是拿该等价定义来证明
一维线性dp的不等式优化
对于形如 f [ i ] = min 0 ≤ j < i { f [ j ] + v a l ( i , j ) } f [ i ] = min 0 ≤ j < i { f [ j ] + v a l ( i , j ) } ,如果 v a l ( i , j ) v a l ( i , j ) 这个函数满足四边形不等式,则一般可以将一维优化为 O ( l o g n ) O ( l o g n )
结论:假设 p [ i ] p [ i ] 为 i i 的最优决策,如果 v a l ( i , j ) v a l ( i , j ) 满足四边形不等式,则 f [ i ] f [ i ] 具有决策单调性,即对于遍历 i i 的任何时候,如果 a ≤ b a ≤ b ,则有 p [ a ] ≤ p [ b ] p [ a ] ≤ p [ b ] 对于 ∀ i ∈ [ 1 , n ] , ∀ j ∈ [ 0 , p [ i ] ] ∀ i ∈ [ 1 , n ] , ∀ j ∈ [ 0 , p [ i ] ] ,都有 f [ i ] = f [ p [ i ] ] + v a l ( p [ i ] , i ) ≤ f [ j ] + v a l ( j , i ) f [ i ] = f [ p [ i ] ] + v a l ( p [ i ] , i ) ≤ f [ j ] + v a l ( j , i )
证明:
由于 p [ i ] p [ i ] 是 i i 的最优决策,则有 对于 ∀ i ∈ [ 1 , n ] , ∀ j ∈ [ 0 , p [ i ] ] ∀ i ∈ [ 1 , n ] , ∀ j ∈ [ 0 , p [ i ] ] ,都有 f [ p [ i ] ] + v a l ( p [ i ] , i ) ≤ f [ j ] + v a l ( j , i ) f [ p [ i ] ] + v a l ( p [ i ] , i ) ≤ f [ j ] + v a l ( j , i )
另外 ∀ i ′ ∈ [ i + 1 , n ] ∀ i ′ ∈ [ i + 1 , n ] ,因为 j ≤ p [ i ] ≤ i < i ′ j ≤ p [ i ] ≤ i < i ′ ,由 v a l ( i , j ) v a l ( i , j ) 的四边形不等式,得 v a l ( j , i ′ ) + v a l ( p [ i ] , i ) ≥ v a l ( j , i ) + v a l ( p [ i ] , i ′ ) v a l ( j , i ′ ) + v a l ( p [ i ] , i ) ≥ v a l ( j , i ) + v a l ( p [ i ] , i ′ ) ,即 v a l ( p [ i ] , i ′ ) − v a l ( p [ i ] , i ) ≤ v a l ( j , i ′ ) − v a l ( j , i ) v a l ( p [ i ] , i ′ ) − v a l ( p [ i ] , i ) ≤ v a l ( j , i ′ ) − v a l ( j , i ) ,则与上式相加得 f [ p [ i ] ] + v a l ( p [ i ] , i ′ ) ≤ f [ j ] + v a l ( j , i ′ ) f [ p [ i ] ] + v a l ( p [ i ] , i ′ ) ≤ f [ j ] + v a l ( j , i ′ ) ,即 对于 i ′ > i i ′ > i 而言,决策 p [ i ] p [ i ] 要比 j ≤ p [ i ] j ≤ p [ i ] 更优,得证
故在遍历 i i 的同时,可以同时更新后面 i ′ > i i ′ > i 的决策,但这样暴力更新的时间复杂度仍需要 O ( n ) O ( n ) ,考虑到对于决策肯定是是一段一段的,不妨将整个区间看成若干个节点,每个节点中存储 j , l , r j , l , r ,表示对于 i ∈ [ l , r ] i ∈ [ l , r ] 的 i i 来说,其最优决策为 j j ,用队列维护这样的节点,遍 历 i 时 , 具 体 要 如 何 更 新 后 面 的 决 策 ? 遍 历 i 时 , 具 体 要 如 何 更 新 后 面 的 决 策 ? 由于 p [ i ] p [ i ] 具有单调性,即可以二分出这样的临界点,不妨从后往前遍历,如果队列尾节点的左端点的决策 i i 要更优,则弹出该节点,直到找到一个节点左端点决策 i i 更差,但右端点 i i 更优,这时可以该节点的左右端点内二分出临界位置,然后再在队列中插入一个左端点为临界位置,右端点为 n n ,最优决策为 i i 的节点,不难发现,总体上,队列删除和添加节点的时间复杂度都为 O ( n ) O ( n ) ,瓶颈在于二分,故可以保证整体上时间复杂度为 O ( n l o g n ) O ( n l o g n ) ,另外,找对于当前 i i 的最优决策并不需要二分,因为在遍历 i i 的时候,对于 i i 前面的数都没用,可以将这部分节点都删除,这时队列头节点即为最优决策
回到本题,本题很容易得到如下 dp
:
状态表示:f [ i ] f [ i ] 表示前 i i 句的最小不协调度
状态计算:f [ i ] = m i n ( f [ i ] , f [ j ] + | s u m [ i ] − s u m [ j ] + i − j − 1 − L | p ) f [ i ] = m i n ( f [ i ] , f [ j ] + | s u m [ i ] − s u m [ j ] + i − j − 1 − L | p ) ,其中 s u m [ i ] s u m [ i ] 为前 i i 个句子的总长度,0 ≤ j < i 0 ≤ j < i
现在证明 | s u m [ i ] − s u m [ j ] + i − j − 1 − L | p | s u m [ i ] − s u m [ j ] + i − j − 1 − L | p 满足四边形不等式
即证明 对于任意的 j < i j < i ,都有 v a l ( j , i + 1 ) + v a l ( j + 1 , i ) ≥ v a l ( j , i ) + v a l ( j + 1 , i + 1 ) v a l ( j , i + 1 ) + v a l ( j + 1 , i ) ≥ v a l ( j , i ) + v a l ( j + 1 , i + 1 )
代入,即证明任意的 j < i j < i ,都有 | s u m [ i + 1 ] − s u m [ j ] + i + 1 − j − 1 − L | p + | s u m [ i ] − s u m [ j + 1 ] + i − ( j + 1 ) − 1 − L | p ≥ | s u m [ i ] − s u m [ j ] + i − j − 1 − L | p + | s u m [ i + 1 ] − s u m [ j + 1 ] + i + 1 − ( j + 1 ) − 1 − L | p | s u m [ i + 1 ] − s u m [ j ] + i + 1 − j − 1 − L | p + | s u m [ i ] − s u m [ j + 1 ] + i − ( j + 1 ) − 1 − L | p ≥ | s u m [ i ] − s u m [ j ] + i − j − 1 − L | p + | s u m [ i + 1 ] − s u m [ j + 1 ] + i + 1 − ( j + 1 ) − 1 − L | p ,设 u = ( s u m [ i ] + i ) − ( s u m [ j ] + j ) − ( L + 1 ) u = ( s u m [ i ] + i ) − ( s u m [ j ] + j ) − ( L + 1 ) ,v = ( s u m [ i ] + i ) − ( s u m [ j + 1 ] + j + 1 ) − ( L + 1 ) v = ( s u m [ i ] + i ) − ( s u m [ j + 1 ] + j + 1 ) − ( L + 1 ) ,则即证 | v | p − | v + a [ i + 1 ] + 1 | p ≥ | u | p − | u + a [ i + 1 ] + 1 | p | v | p − | v + a [ i + 1 ] + 1 | p ≥ | u | p − | u + a [ i + 1 ] + 1 | p ,即证明 | x | p − | x + C | p | x | p − | x + C | p 为减函数,一种常见的证明方法,将整个定义域分为 [ − ∞ , − C ] , [ − C , 0 ] , [ 0 , ∞ ] [ − ∞ , − C ] , [ − C , 0 ] , [ 0 , ∞ ] 三部分,另外再分别求导即可,这里不再赘述
代码
__EOF__
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战