BZOJ 5125 小Q的書架

2022-07-03 22:30:17 字數 1027 閱讀 6704

小 \(q\) 有 \(n\) 本書,每本書有乙個獨一無二的編號,現在它們正零亂地在地上排成了一排。

小 \(q\) 希望把這一排書分成恰好 \(k\) 段,使得每段至少有一本書,然後把每段按照現在的順序依次放到 \(k\) 層書架的每一層上去。

將所有書都放到書架上後,小 \(q\) 這才突然意識到它們是亂序的,他只好把每一層的書分別按照編號從小到大排序。排序每次可以在 \(1\) 單位時間內交換同一層上兩本相鄰的書。

請寫乙個程式,幫助小 \(q\) 計算如何劃分這 \(k\) 段,且如何交換這些書,使得總交換次數最少。

第一行包含兩個正整數 \(n,k\)。

第二行包含 \(n\) 個互不相同的正整數 \(a_1, a_2, ..., a_n\),分別表示地面上每本書的編號。

輸出一行乙個整數,即最少的總交換次數。

6 3

4 3 6 2 5 1

1
按 \([4, 3, 6][2, 5][1]\) 劃分,需要排序 \(1 + 0 + 0 = 1\) 次。

\(1 \le n \le 40000, 1 \le k \le min(10, n), \forall 1 \le a_i \le n\)

\(dp\) ,決策單調性

其實決策單調性也沒啥可怕的地方,主要重點在於你的思考!

我們先列出最樸素的 \(dp\) 方程:\(dp[i][j]\) 表示將前 \(i\) 本書劃分到 \(j\) 層書架的最小代價,那麼我們設 \(w(i,j)\) 代表區間 \([i,j]\) 內的逆序對數目,我們就有如下方程:

\[dp[i][j]=min_

int query(int x)

void move(int l, int r) //莫隊式移動

void solve(int l, int r, int l, int r)

solve(l, mid - 1, l, p);

solve(mid + 1, r, p, r); //遞迴

}int main()

bzoj 12月月賽D小 Q 的書架

將乙個序列分成k段,使每一段的逆序對和最小。dp 分治。第一次做將決策分治的題,看了題解一臉矇逼,今早拿到 才知道什麼意思 首先有個容易想到的決策單調性,就是假如j k,且j優於k,那麼j一直都優於k。然後將決策分治,就是傳入當前轉移範圍,而對於逆序對的個數,樹狀陣列維護就行了。口胡不清,具體 co...

BZOJ4268 小強的書架

首先將所有高度乘上10,設f i 為將前i本書放入書架的最小高度,則 begin f i min f j 1 first j,i second j,i w s i s j 1 min f j 1 first j,i second j,i w s i s j 1 min f j 1 first j,i...

BZOJ4813 Cqoi2017 小Q的棋盤

找以起點為起點的乙個最長鏈,最優一定是在最長鏈上不走回頭路的,所以相當於最長鏈上的邊代價是1,非最長鏈的邊代價是2 因為要走回去 每付出一次代價就可以使訪問到的點數 1,那麼貪心即可 include include include include include include include in...