bzoj1044 HAOI2008 木棍分割

2021-07-27 23:17:19 字數 835 閱讀 4039

傳送門

第一問隨便二分就過了,此處略去。

第二問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...