[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.
注意到每個圖案實際上只有三類,分別是:
- 這個方格必須被橫骨牌覆蓋
- 這個方格必須被豎骨牌覆蓋
- 這個方格被橫豎骨牌覆蓋均可
令 \(f_i\) 表示鋪完前 \(i\) 列的方案數,題目提到:
- 如果有一個橫多米諾骨牌的左半邊位於第 \(j\) 列,那麼在第 \(j - 1\) 列或第 \(j + 1\) 列就沒有橫多米諾骨牌的左半邊。
也就是說不會有上一列凸出來的狀態,這意味著第 \(i\) 列要麼全部鋪豎著的骨牌,要麼在第 \(i - 1\) 列和 \(i\) 列鋪至少一個橫骨牌,而如果鋪了一個橫骨牌,這兩列的貢獻就獨立了。
所以我們可以用另外一個 DP 求出至少放一個橫骨牌的方案數。
這樣可以實現轉移。
處理輸入的時候有小技巧,只需要提取圖案的特徵即可,例如橫6 的第二行第一列一定有點,別的圖案沒有這個特徵,這就可以作為判定橫豎的依據,可以大大縮減程式碼量。
E.
前置知識:笛卡爾定理。
顯然粉圓的半徑為 \(R - r\),根據笛卡爾定理,可以列出一個關於第 \(i\) 個圓的半徑,第 \(i - 1\) 個圓的半徑,金圓半徑,盤子半徑的方程,形如:
透過韋達定理,以及圓的對稱性發現,第 \(i - 2\) 個圓的半徑是其中一個根,可以快速得到第 \(i\) 個圓的半徑,如此遞推即可。