口胡題解
2018.9.13
-
可以發現如果兩個構造的數在摸意義下相同,保留最小的一個數即可。
-
所有直接上,所有點都在摸意義下,轉移時直接由點
-
最後最大值減就是答案了.
-
典型的樹形依賴揹包,然後可以用經典的方法解決:
- 一樣是表示以第個點為根,容量的最優答案.
- 轉移時,先直接列舉一遍容量轉移兒子,然後再通過兒子轉移自己,後者只需要按位取
-
當然還有一種用序的方法,其實也是類似的:
- 通過從大到小列舉值,然後如果一個點不選,那就直接轉移到去,這裡轉移顯然是取(表示序為的點)
- 如果選,則直接由轉移過來。
-
很容易想到直接按照題意加資料結構樹狀陣列模擬,常熟賊小.
-
然而實際上,這是一道可以僅憑耐心做出來的題,仔細觀察每當下標往右移一位時,所有數與下標相減的變化.
-
是可以做到的。
2018.9.18
-
直接列舉子樹大小,然後判斷是否有個點的節點的是的倍數.
-
.
2018.10.6
-
點分治裸題.
-
先計算小於等於的路徑方案數。
-
二分一個在中的閾值,再看看減去的方案是否還有即可.
-
一道極其猥瑣的搜尋題.
-
好吧,實際上是我太弱.
-
我們可以加很多個優化,然鵝依然無法在1s的時間內通過這道題.
-
所以實際上需要一個記憶化!!! 我們可以設表示還剩下個人沒有配對成功,剩下個人的hash狀態為時這個方案是否可行。
-
這樣直接搜尋,事實上是比較複雜的.
-
然鵝我們可以用搜尋套搜尋的方式去更加簡潔地實現.
-
點分樹強悍做法.
-
假設現在詢問只有一個,那麼一個極顯然的做法就是二分一下答案,然後點分治即可.
-
詢問有個,所以我們需要強悍的點分樹.
-
我們處理好每個分治中心管轄的範圍,然後對於每一個詢問,我們像先前一樣二分ans.
-
只不過這個時候,我們要在的時限內達到.
-
也很簡單,我們統計過當前詢問點,以及過它所在的分治中心(總共有log個)的條數.
-
也就是直接在那個分治中心的管轄範圍的序列上二分即可.
-
因為這樣會算重,所以對於每一個點,我們需要算兩遍:
- 在最近的一個分治中心算一遍,加上
- 再在第二近的分治中心算一遍,減去
- 注意兩遍的depth陣列是不一樣的…
-
這種點分樹的方法非常強大,需要好好領悟.
-
然而大佬lzw提供了一種它的牛逼二分方法,這種方法時間複雜度與上面做法是一樣的,都是.
-
事實上,可以對於每一個點分別記錄兩個值,然後類似二分答案一樣,不過對於每個點二分的答案都不一樣,對於每個點,要二分的值實際上是.
-
這樣做完一遍樹分治之後,調整的值,即如果一個點已經得到的路徑數多了,那就把改小,否則把增大.
2018.11.1
-
因為有關位運算,很容易想到按位處理.
-
因為是與運算,所以沒進行一次計算,的個數只會減少而不會增多.
-
那麼可以線上段樹上暴力修改,每修改一次,的個數都只會減少,否則沒有必要往下修改嘛.
-
所以勢能分析一波,就是的了。
2018.11.2
-
考慮最簡單的氣泡排序.
-
每次找到最左邊的一對相鄰逆序對進行交換,直到沒有為止,線段樹的每個葉節點相當於是一個01狀態表示與其相鄰點(下一個點)是否需要交換.
-
同樣是勢能分析,同樣是線段樹上操作,哎。。。
-
又是一年DP題.
-
注意到題目最重要的一個性質:點度數.
-
那麼容易想到狀壓一個點連出去的邊.
-
現在考慮以然後考慮一條非樹邊進行的影響,至多是兩條邊,且會產生一個貢獻,把這看成一個物品(也是一種物品).
-
另一種物品則是一條邊不被非樹邊覆蓋時的貢獻,其實就是子樹的f最大值.
-
然後揹包一下即可.
-
原諒我這是口胡的,所以只有自己能看懂。。。
-
略屌的一道貪心題.
-
考慮樹上權值最大的點,必定是在其父親染色完之後立刻染色,那麼實質上可以把這兩個點合併起來,權值為兩點權值的平均值
-
一直做下去,以後新產生的點,權值就是所有原始權值除以點數.
-
我發現自己做這種需要一點點智商的題很弱啊.
-
還是需要多思考.
-
類似對頂堆,我們搞一個“對頂棧”.
-
游標的左移和右移實質上都可以轉化為兩個棧棧頂的變化.
2018.11.8
-
要把,那麼考慮中一些相同的數.
-
這些要移到的位置其實是知道的,對應串的順序,如
-
那麼第一個就要移到第個位置,第二個就要移到第個位置,把串的每個位置用其對應位置表示,容易發現,這個新序列的逆序對個數就是答案了!
-
很經典的一道題,先考慮二維。
-
然後轉化到三維,令表示到第個點,且不經過以前所有點的方案數.
-
直接用總方案減去不合法就行了.
-
假設從一個點,總方案必定是