然後最後呢 又得到了什麼……
AT_abc318_f
假設知道了位置,我們可以貪心地判斷。
現在只需要找到一些本質不同的位置即可。本質相同意思是這兩個位置使用相同手臂可以到達寶藏區間是一樣的。
直接欽定 \(i\) 手臂可以到達寶藏 \(j\),這樣可以圈出一個區間,把平方個點全部拿出來排序過後兩兩相鄰的位置間就是本質相同的位置。
我們只需要判斷平方個位置即可,每次判斷線性對數。
AT_agc012_b
很人機的題啊。聽說有 xxs 做法是直接暴力 dfs 剪枝。
注意到 \(d\) 很小。但是每次暴力會被菊花圖卡掉。
考慮一次傳遞,本質上是 \((x,d)\to (y,d-1)\)。這個狀態可以刻畫。
於是把詢問作為初始化,跑 dp 即可。
P5093 AT_arc081_c
前面那個題只需要求答案。
顯然每次選擇一個剛好包含所有值域的段的最右邊的點即可,可以用 set 維護。
後面要字典序最小,發現上述貪心直接死掉。
我們仍然希望每次選擇的數字最小,並且選擇該數字後不影響最終的長度。
可以用 dp 算出每個位置的字尾的長度,貪心時候判斷可不可行即可。
AT_abc163_e
有一個很顯然的思路是大的數儘量放兩邊。證明顯然。
那麼直接區間 dp 就做完了。當然為了方便實現可以從小到大決策 \(a\),這樣始終是一個區間。
Duel 記錄(10.29~30)
跳過人機題。
CF1209E2
和 Kares 開的 *2500,我們都不會。被 ddxrS 薄紗了。
讓我們注意性質。每一行只與最大值是什麼有關,其它列並不重要。所以決定性的列數就是最大值的貢獻次數,是 \(O(n)\)。所以輸入矩陣就變成了 \(12\times 12\)。
一看就是狀壓 dp。但是我們無法確定當前選擇的這個數究竟是否真的是這一行的 max。考慮“錯誤” dp:每次欽定當前選的是/不是最大值。
雖然最大值可能被錯算,但是容易發現錯算後結果會變小,而正確計算的結果一定會被答案算到。這是一種很經典的 trick。
那麼轉移是簡單的,列舉當前這一列有哪些行作為了行最大值,列舉子集轉移即可。
CF28C
題目背景???
果然機率期望還是太菜了。
讓我們把這個最大值記錄在狀態裡面,然後 dp 計算方案數。
最後的答案就是每個最大值的方案數帶權和,除以總共的方案數。
轉移是簡單的,在 \(x\) 個人裡面選擇 \(y\) 個的方案是 \(C_{x}^y\)。
CF238A
我一眼秒了,ddxrS 被秒了。
顯然原序列和字首和序列形成雙射,就是要求異或字首和互不相等即可。注意還不能是 0。由於值域是 2 的冪次,所以沒有影響。
就相當於算在 \(2^m-1\) 個數中選擇 \(n\) 個互不相同的數的方案數。做完了。
CF1042C
我被秒了,寫得太屎了。
考慮討論負數和 0 的個數。
如果有奇數個負數,那麼我們一定要刪除其中最小的那個。同時有 0 的情況不用管,因為如果你把 0 刪了答案就是負數了。
否則我們透過操作把 0 刪掉就可以了。注意實現。