傳送門
第一問隨便二分就過了,此處略去。
第二問dp
f[i][j]前i根木棍,砍了j刀的方案數。
轉移方程很顯然,此處略去。
我們可以滾掉一維。
但是轉移要o(n^2m),顯然要t
於是我們可以用單調佇列+字首和優化轉移,使得時間複雜度降為o(nm)
然後就過了。
#include
#include
#include
#include
#include
#include
using
namespace
std;
int f[2][50005],a[50005];
int n,m,x,l,r,mi,s,sum,c,k,ans;
int main()
r=a[n];
while (l2;
s=1;
sum=1;
for (int i=1;i<=n;i++)
if (a[i]-a[s-1]>mi)
if (sum>m) l=mi+1; else r=mi;
}printf("%d ",l);
c=ans=0;
f[0][0]=1;
for (int i=1;i<=m;i++)
f[c][j]=sum;
sum=(sum+f[1-c][j])%10007;
}ans=(ans+f[c][n])%10007;
}printf("%d",ans);
return
0;}
BZOJ 1044 HAOI2008 木棍分割
注意可以且m次,即分成m 1段。所以先讓m加上1。先做乙個簡單的二分答案算出最小的最大值。然後可以得到乙個o mn 2 的dp。發現dp可以通過字首和把時間複雜度優化為o nm 通過滾掉記錄m的那一維,把空間複雜度優化為o n include define left leftt using name...
BZOJ 1044 HAOI2008 木棍分割
bzoj 1044 haoi2008 木棍分割 二分答案 dp 有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連 接處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長 度最大的一段長度最小.並...
BZOJ1044 HAOI2008 木棍分割
有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連 接處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長 度最大的一段長度最小.並將結果mod 10007。輸入檔案第一行有2個數n,m.接下來n...