AtCoder瞎做第二彈

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)\)

代碼

Submission #5013272

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}\) ,意義明顯許多。

代碼

Submission #5016238

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章