BZOJ 1044 HAOI2008 木棍分割

2022-08-16 14:51:13 字數 890 閱讀 9738

題解:

第一問二分答案

第二問用f[i][j]表示前i塊分成j段的方案數

但是mle

於是改變列舉順序

先列舉j,然後i這一層用滾動陣列優化

f[i][j]=sigma f[k][j-1](sum[i]-sum[k]<=ans)

決策是一段區間,而且左端點單調,搞個指標維護最左的決策點

#include#include#include#includeusing namespace std;

const int maxn=100009;

const int mm=10007;

int n,m;

int s[maxn]=;

int tot=0;

int l=0,r=0,mid=0,ans=0;

int f[maxn]=;

int g[maxn]=;

int isok()

} ++cnt;

if(cnt>m)return 0;

else return 1;

}int main()

r=1000000000;

while(l<=r)else

} printf("%d ",ans);

for(int i=1;i<=n;++i)

for(int j=2;j<=m;++j)

f[i]=tm;

tm=(tm+g[i])%mm;

} tot=(tot+f[n])%mm;

// for(int i=1;i<=n;++i)cout

printf("%d\n",tot);

return 0;

}

bzoj1044 HAOI2008 木棍分割

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

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根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長 度最大的一段長度最小.並...