覆盤
T1。好難好難。先寫了 \(\mathcal O(n^2)\) DP,但是沒有任何前途。
嘗試瞎推式子瞎猜性質。過了很久發現想得太複雜了。2h 過大樣例。對拍。
T2。發現有 \(20\) 分很容易。這兩個性質怎麼做?
然後想性質時發現會正解了。好激動,趕緊寫。
雖然細節挺多但是基本沒調。T2 用了不到 1h。看起來大樣例挺強就不對拍了。
T3 沒任何思路。先把暴力寫了看 T4。
T4 好神奇,竟然下發了 checker.cpp(雖然我不會用)。
直接模擬氣泡排序就能拿到 \(10\) 分。先寫了。
發現還有 1h。想 T3 還是 T4?
算了想 T4 吧,這麼有趣的題很少見。
嘗試 \(n=8\)。發現可以拆成兩個 \(n=4\)。\(n=4\) 的方法樣例給了,用 \(4\) 步。但是怎麼合併?
仿照歸併排序肯定不行。
然後又是瞎試了一會,發現有個很簡單的用 \(4\) 步合併的方法。這樣 \(n=8\) 就能做到 \(8\) 步。能得 \(8\) 分……?太賺了太賺了。繼續想別的測試點。
\(n=13\) 質數肯定不好做。\(n=16\)?這不跟上面一樣,拆成兩個 \(n=8\) 的,然後再用 \(8\) 步合併?
誒 \(n\) 是 \(2\) 的冪的是不是都能這樣做。算一下……總共 \(26\) 分!
因為給的 checker.cpp 不會用所以我自己根據題意手寫了一個。很快調完了。
還有 20min。繼續做 T4 發現怎麼最佳化這個演算法都和氣泡排序一樣分(\(1\) 分)。
檢查了一下就交了。
\(100+100+12+26=238\)。沒掛分。
總結
好的:
- 沒掛分(這場不掛分真挺難的)
- T4 得到的部分分很多
不足:
- T1 花的時間有點久。儘管最後時間並沒有十分緊張。
知識點
T1:數學,貪心
T2:set,線段樹,貪心
題解
A. 鄰間的骰子之舞
為了方便,讓整個過程結束後再複製一次。別忘了最後答案減去 \(x\)。
令我們在有 \(a_1,a_2,\dots,a_m\) 個字元時進行了複製操作。需要滿足:
- \(1=a_1<a_2<\dots<a_m\);
- \(a_m \ge n\);
- \(a_i \bmod a_{i-1}=0\)。
那麼答案為 \(mx + y\sum_{i=2}^m \frac{a_i-a_{i-1}}{a_{i-1}}\)。
\(mx - (m-1)y+ y\sum_{i=2}^m \frac{a_i}{a_{i-1}}\)。
令 \(k_i=\frac {a_i}{a_{i-1}}\),\(k_1 = a_1\)。
注意到 \(a_m = \prod_{i=2}^m k_i\)。所求是 \(\sum_{i=2}^m k_i\)。問題變成了:
找 \(m\) 個數,使得乘積 \(\ge n\) 且和最小。求這個最小和。
二分判斷:
是否存在 \(m\) 個數,使得其和 \(\le mid\),且乘積 \(\ge n\)?
和一定,差小積大。肯定先平均分。剩下的能鋪多少鋪多少。
B. 星海浮沉錄
若答案為 \(0\),則意味著陣列中離得最近的兩個 \(0\) 中間的數的數量 \(\ge x\)。
在答案不為 \(0\) 的情況下,若答案為 \(1\),則意味著陣列中離得最近的兩個 \(1\) 中間的數的數量 \(\ge x\)。
令 \(p_i\) 表示陣列中離得最近的兩個 \(i\) 中間的數的數量。那麼答案為最小的滿足 \(p_i \ge x\) 的 \(i\)。
如果能維護這個 \(p\),那麼找到答案可以線段樹上二分。
用 set 維護這個 \(p\)。