題解 HAOI2008木棍分割

2022-02-27 14:04:15 字數 1082 閱讀 4413

對於這道題目的兩問,第一問直接二分答案求出最短長度。關鍵在於第二問應當如何求:建立dp方程,dp[i][j]代表到第i個分界線,切了j次(強制在第i處切一刀、這樣就不會對後面的狀態產生影響)。狀態轉移的方程即是當前分界線列舉上一條分界線在**,上一條分界線與當前線之間如果相差不超過之前二分出來的答案,就可以判定合法,方案數累加。因為注意到合法的分界線必然是一段連續區間,且單調右移不減,所以使用乙個佇列來維護佇列內的元素總值。雖然讓我感到非常玄學的是明明資料很小,我的陣列一開小了就wa?不是很理解……

#include using

namespace

std;

#define maxn 5000000

#define maxm 300000

#define mod 10007

#define inf 99999999

int m, maxx, fans, ans, a[maxn], sum[maxn], dp[maxm][3], n, pre = 0, now = 1

;int

q[maxn], tot, head, tail;

bool

mark[maxn];

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}bool check(int

x) }

return

true;}

void

solve()

}void

dp()

bool flag = false

;

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

}now ^= 1, pre ^= 1

; }

}int

main()

solve();

cout

<< ans << "";

dp();

cout

return0;

}

木棍分割 HAOI2008

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

HAOI2008 木棍分割

沒寫過幾道的字首和優化 dp 第一問是小學生難度的二分 第二問就直接 dp 了 設 dp i j 表示當前分割點在 i 之後,前面一共分割了 j 段的方案數 利用字首和單調性,通過二分預處理出每乙個點往前能擴充套件到的最大位置,之後字首和優化就可以啦 但是發現這個樣子空間會炸,而這個樣子還沒有辦法滾...

HAOI2008 木棍分割

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