P4244【HAOI2008】木棍分割
问题描述
有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小. 并将结果mod 10007
输入格式
第一行有2个数n,m. 接下来n行每行一个正整数Li,表示第i根木棍的长度.
输出格式
2个数, 第一个数是总长度最大的一段的长度最小值, 第二个数是有多少种砍的方法使得满足条件.
样例输入
3 2
1
1
10
样例输出
10 2
数据范围
n<=50000, 0<=m<=min(n-1,1000)
1<=Li<=1000
首先,总长度最大的一段的最小值,显然的二分答案,水过。同时令答案为$T$
然后,考虑方案数,考虑递推,令$F[i][j]$表示前$i$段切$j$刀,且使得每段长度不超过$T$的方案数。
容易得到$$F[i][j]=\sum_{Sum[i]-Sum[k] \leq T} F[k][j-1]$$
其中$Sum$表示长度的前缀和,那么时间复杂度$O(mn^2)$,空间复杂度$O(mn)$,显然过不了。
空间很容易用滚动数组解决,那么考虑优化时间,注意到$Sum$单调递增,那么我们可以用单调队列维护$k$,那么就可以$O(1)$的获取到$k$的最小值,然后需要将$F[k][j-1]$到$F[i-1][j-1]$累和,考虑用前缀和优化,那么观察可以发现,只需要优先枚举$j$,然后就可以实现前缀和优化了。
代码:
1 |
|