[CF77] Codeforces Beta Round 69 (Div. 1 Only) A~E 題解

MoyouSayuki發表於2024-03-10

[CF77] Codeforces Beta Round 69 (Div. 1 Only) A~E 題解

A.

水,爆搜即可,這題難度在處理輸入。

B.

考慮把 \(p, q\) 的取值範圍在平面直角座標系裡表示出來,此時平面內如果一個點 \((x, y)\) 滿足 \(x\in[-b, b], y\in[0, a]\),它對應了一組 \((p, q)\),滿足條件的點構成了一個矩形,矩形被 \(y = 4x\) 這條直線切成了兩部分,左半部分滿足 \(y > 4x\) 的點構成了一個多邊形,它們是符合題意的,則原題可以考慮成求左多邊形面積比矩形面積,分類討論一下發現要麼左邊是梯形,右邊是三角形可以整體減空白做。

特殊處理 \(b = 0\) 的情況。

C.

考慮 \(f_i\) 表示從 \(i\) 出發,迴游以 \(i\) 為根的子樹最多走多少個點,\(g_i\) 表示此時 \(i\) 剩餘多少海狸。

子節點回溯的時候一定要經過根節點,所以可能根節點的海狸數量不夠走完所有兒子,這個時候很明顯只需要取前 \(a_i- 1\) 大的兒子走即可。

否則走完所有兒子不劣,如果走完了還有剩餘的海狸,並且子節點也有剩餘,可以考慮當前點和子節點反覆橫跳,直到子節點沒有海狸或者當前點沒有海狸了。

兩種情況分別可以實現轉移,注意維護 \(g\) 陣列,注意走到一個點的時候也會需要一個海狸,一開始出發的時候不會計算貢獻。

D.

注意到每個圖案實際上只有三類,分別是:

  1. 這個方格必須被橫骨牌覆蓋
  2. 這個方格必須被豎骨牌覆蓋
  3. 這個方格被橫豎骨牌覆蓋均可

\(f_i\) 表示鋪完前 \(i\) 列的方案數,題目提到:

  • 如果有一個橫多米諾骨牌的左半邊位於第 \(j\) 列,那麼在第 \(j - 1\) 列或第 \(j + 1\) 列就沒有橫多米諾骨牌的左半邊。

也就是說不會有上一列凸出來的狀態,這意味著第 \(i\) 列要麼全部鋪豎著的骨牌,要麼在第 \(i - 1\) 列和 \(i\) 列鋪至少一個橫骨牌,而如果鋪了一個橫骨牌,這兩列的貢獻就獨立了。

所以我們可以用另外一個 DP 求出至少放一個橫骨牌的方案數。

這樣可以實現轉移。

處理輸入的時候有小技巧,只需要提取圖案的特徵即可,例如橫6 的第二行第一列一定有點,別的圖案沒有這個特徵,這就可以作為判定橫豎的依據,可以大大縮減程式碼量。

E.

前置知識:笛卡爾定理

顯然粉圓的半徑為 \(R - r\),根據笛卡爾定理,可以列出一個關於第 \(i\) 個圓的半徑,第 \(i - 1\) 個圓的半徑,金圓半徑,盤子半徑的方程,形如:

\[-\dfrac{1}{r_i^2} + 2(-\dfrac{1}{r_1} +\dfrac{1}{r_2}+\dfrac{1}{r_{i -1}}) \dfrac{1}{r_i}+c = 0\]

透過韋達定理,以及圓的對稱性發現,第 \(i - 2\) 個圓的半徑是其中一個根,可以快速得到第 \(i\) 個圓的半徑,如此遞推即可。

相關文章