P2511 HAOI2008 木棍分割

2022-05-19 08:22:38 字數 1024 閱讀 7664

傳送門

第乙個問題直接二分答案

然後第二個問題直接在二分出的答案下跑一遍 $dp$,設 $f[i][j]$ 表示當前已經切了 $i$ 次考慮完前 $j$ 個位置並且強制切 $j,j+1$ 時的方案數

那麼有轉移 $f[i][j]=\sum_^f[i-1][k]$,發現隨著 $j$ 增加 $l$ 不減,所以轉移可以用字首和並動態維護左端點優化到 $o(1)$

初始狀態特殊處理一下就行,然後因為有強制切,發現切 $n,n+1$ 是沒意義的,所以 $ans=\sum_^f[i][n]$,$m+1$ 是因為最後切的一次沒意義

然後滾動陣列把 $i$ 滾動掉即可

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;inline

intread()

while(ch>='

0'&&ch<='

9')

return x*f;

}const

int n=5e4+7,mo=10007

;inline

int fk(int x)

intn,m,a[n],sum[n],f[n],sf[n];

intmx,ans;

bool check(int

p)

return1;

}int

main()

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

ans+=f[n];

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

sf[0]=0; for(int j=1;j<=n;j++) sf[j]=fk(sf[j-1]+f[j]);

ans=fk(ans+f[n]);

}printf(

"%d %d\n

",mx,ans);

}

P2511 HAOI2008 木棍分割

目錄有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連線處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長度最大的一段長度最小.並將結果mod 10007。二分答案 動態規劃 include i...

洛谷 P2511 HAOI2008 木棍分割

這題卡常,別用long long 這題第一問好搞,直接二分答案 第二問,凡是看到求方案數並於組合數一定沒有關係的一定用 dp 解決!然後定義狀態,顯然 轉移就是 然後我就不會優化了,看了題解,發現自己思維僵化竟然如此簡單 然後可以用字首和優化 要用滾動陣列 luogu judger enable o...

木棍分割 HAOI2008

有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連 接處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長 度最大的一段長度最小.並將結果mod 10007。輸入檔案第一行有2個數n,m.接下來n...