BZOJ 1044 HAOI2008 木棍分割

2021-10-03 05:01:56 字數 981 閱讀 2600

注意可以且m次,即分成m+1段。所以先讓m加上1。

先做乙個簡單的二分答案算出最小的最大值。然後可以得到乙個o(mn^2)的dp。

發現dp可以通過字首和把時間複雜度優化為o(nm),通過滾掉記錄m的那一維,把空間複雜度優化為o(n)。

#include

#define left leftt

using

namespace std;

const

int n=

5e4+

5,mod=

10007

;int n,m,l,r,mid,ans,ans2,now;

int a[n]

,aa[n]

,left[n]

,f[n]

,sum[n]

;inline

bool

jay(

int mid)

return

true;}

intmain()

now=1;

for(

register

int i=

1; i<=n;

++i)

now=0;

for(

register

int i=

1; i<=n;

++i)

sum[0]

=0;for

(register

int i=

1; i<=n;

++i) sum[i]

=(sum[i-1]

+f[i]

)%mod;

ans2=f[n]

;for

(register

int j=

2; j<=m;

++j)

printf

("%d %d\n"

,ans,ans2)

;return0;

}

bzoj1044 HAOI2008 木棍分割

傳送門 第一問隨便二分就過了,此處略去。第二問dp f i j 前i根木棍,砍了j刀的方案數。轉移方程很顯然,此處略去。我們可以滾掉一維。但是轉移要o n 2m 顯然要t 於是我們可以用單調佇列 字首和優化轉移,使得時間複雜度降為o nm 然後就過了。include include include ...

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...