傳送門
第乙個問題直接二分答案
然後第二個問題直接在二分出的答案下跑一遍 $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...