ARC 067
F - Yakiniku Restaurants
題意
\(n\) 家飯店,\(m\) 張餐票,第 \(i\) 家和第 \(i+1\) 家飯店之間的距離是 \(A_i\) ,在第 \(i\) 家飯店用掉第 \(j\) 張餐票會獲得 \(B_{i, j}\) 的好感度,可以從任意一個飯店出發,求好感度減經過的距離和的差的最大值。
\(2 \le n \le 5000, 1 \le m \le 200, 1 \le A_{i, j}, B_{i, j} \le 10^9\)
題解
做題千萬條,看題第一條。
顯然我們不會走回頭路,那麼每次我們選擇的一定是一段連續區間 \([l, r]\) 。
考慮每個 \(B_{i, j}\) 對於哪些區間有貢獻,找到左右第一個比它的 \(B_{x, j}, B_{y, j} \ge B_{i, j}\) ,那麼它貢獻的區間其實就是 \(l \in (x, i], r \in [i, y)\) 。
我們利用單調棧算出端點,然後矩形加利用二維差分實現即可。
\(\mathcal O(n^2 + nm)\)
代碼
ARC 068
F - Solitaire
題意
有一個雙端隊列。
首先將 \(n\) 個數 \(1\sim n\) 從小到大任意前後地添入隊列。然後任意前後地彈出隊列,求最後彈出來的排列中,第 \(k\) 個數爲 \(1\) 的排列有多少種。
\(1 \le k \le n \le 2000\)
題解
一開始添完的序列性質顯然是將 \(1\) 分成兩段,左邊遞減,右邊遞增。
由於構造合法序列是左右彈元素,那麼性質就比較好推了。
- 第 \(k\) 個數爲 \(1\) ;
- 前 \(k - 1\) 個數可拆分爲至多兩個下降子序列;
- 前 \(k - 1\) 個數的最小值一定大於後 \(n - k\) 個數的最大值。
先考慮最後 \(n - k\) 個數的方案,如果我們確定了前 \(k\) 個數,那麼剩下的 \(n - k\) 個數是由一個單調隊列彈出來的,除了最後一次只能彈一個,別的每次都有兩種選擇,所以方案是 \(2^{\max(0, n - k - 1)}\) 。
然後前面拆分成至多兩個下降子序列,這個和 這道題 是一樣的。
我們現在只需要滿足第一個限制了,由於第 \(k\) 個數是需要最小值,用至多選 \(k\) 個和 \(k - 1\) 個差分一下即可。
然後利用之前那個題的組合數結論就可以做到 \(\mathcal O(n)\) 了。
其實那個組合數有個更優美的形式,也就是 \(\displaystyle {n + m \choose m} - {n + m \choose m - 1}\) ,意義明顯許多。