1. 程式人生 > 實用技巧 >Review 2020.10.29

Review 2020.10.29

Date range: 10.12 - 10.29

求 [a,b] 之間相鄰數位只差不超過 2 的數字個數。

數位 dp,狀態表示為:走了幾位,最後一位是幾,當前數字是否貼著上界。


求 [a,b] 二進位制表示中 0 的個數大於 1 的個數的數有多少個。

數位 dp,狀態表示為:走了幾位,當前 0 的個數,當前 1 的個數。


求滿足本身乘以它所有數位的乘積在 [a,b] 之間的所有數字的個數。

所有數位的乘積數目很少,暴力列舉之,然後會做一個關於質因子數目限定的數位 dp。


構造一個具有 n 的三元環的無向圖,n 不超過 2e6,點數不超過 500.

暴力,不斷構造若干個相互獨立的完全圖。


給定 n 根柱子,按任意順序放置為一個二維圖形,求所有可能的盛水量。

顯然我們只會從高到低放置柱子或者放棄一些柱子,維護水量和柱子高度的總和,f[i][j] 表示填了 i 個空位,能否拼成 j 的水量和柱子高度的總和,暴力轉移即可,用 bitset 優化。


求帶點權無向圖的邊權和最小的哈密頓迴路,邊權是點權的差的平方。

只需要最優化交叉乘積項,找規律貪心。


點權樹,求極差不超過 d 的連通子圖的個數。

\(O(n^2)\) 的樹形 dp,難點在於處理點權相等的情況,此時比較編號即可。


給定一個序列,如果 i,j 中間沒有任何一個數比端點大,或者沒有任何一個數比端點小,則可以從 i 跳到 j。求從 1 跳到 n 的最小步數。

考慮 dp,所有轉移來源對應單調棧彈棧過程中經歷的所有棧頂。


在樹上刪除最多的邊,使得所有點離最近的黑點的距離不超過 d。

從所有黑點開始 BFS,若 q 被訪問過而 (p,q) 沒被訪問過,則 (p,q) 可以被刪。


給定一個序列無限次操作,每次選擇一個區間讓該區間內的所有數變成區間的平均數,求操作後字典序最小的序列。

單調棧,每次棧頂比待入棧元素高就暴力彈棧,將被彈出的元素和待入棧的元素合併。


給定一張 \(n,m \le 10^3\) 的圖,有 \(k\) 個點對 \((a_i,b_i)\) 表示運輸專案,選擇一條邊的權值變為 \(0\) 來最小化所有運輸專案的最短距離的和。

考慮 \((u,v)\) 變為 \(0\)\((a,b)\) 的影響,分經過和不經過 (u,v) 討論


\(n\times m\) 迷宮中一秒鐘可以向四個方向中的一個移動 \(1 \to k\) 步,求起點到終點的最短時間。\(n,m,k \le 1000\)

正常 BFS,剪枝條件小心。


給定一個 \(n \times m\) 矩陣,要求每行只能選取不超過一般的元素,使得選出元素的總和是 \(k\) 的倍數,且這個總和最大。求這個最大值。

一堆 dp。


給定一本字典的若干頁,每頁上會有若干個單詞,這本字典的字母順序是標準順序的一個排列。求出任意一種排列或者判定非法。重編號後簡單拓撲排序。


給定一個長度為 n 的序列 a,有 q 次操作,每次交換 a[l],a[r],在操作前和每次操作後,求出 a 中所有子序列的交替和的最大值。

其實就是在差分序列中選出一些段。於是只需要選擇那些 >0 的部分即可。同時每次操作只會影響到不超過 4 個位置,暴力維護即可。


將 n 的所有大於 1 的因數任意排列在一個環上,每次選擇相鄰兩個數,在中間插入他們的最小公倍數,使得環上不存在兩個相鄰且互質的數。找到一個操作次數最少的排列。

從最小數開始每次選擇一個與上一個數不互質的最小數輸出。


數軸上有 n 個點,每次操作可以把所有位於 x 的左移或右移一格,求所有點移動到不超過兩個整點的最小操作次數。對點集做出修改,動態維護答案。

對於有序集,維護最大 gap。


給定有根樹,每個結點上有 N 個人,每個人可以選擇任意孩子方向走,直到走到葉子結點為止,問最後人最多的葉子結點最多有多少人。

p 的答案一定不會小於 q 的答案,也不小於整個子樹平均分配的答案。這也是一定能取到的。


給定一個數列,其中一些元素固定,另一些元素可以修改。要求修改最少的元素使得這個序列變成嚴格單增的序列。

固定元素將原序列分割成了若干段,每段內求一下 LCS,剩下的就是需要移動的。注意,如果超出了左右兩側的固定元素限制的值域,那麼這個元素也必須被移動。