1. 程式人生 > >口胡題解

口胡題解

2018.9.13

  • 可以發現如果兩個構造的數在摸x1x_1意義下相同,保留最小的一個數即可。

  • 所有直接上SPFASPFA,所有點都在摸mm意義下,轉移時直接由點x(x+ai)%a1x\rightarrow (x+a_i)\%\ a_1

  • 最後最大值減x1x_1就是答案了.

  • 典型的樹形依賴揹包,然後可以用經典的方法解決:

    • 一樣是f[i][j]f[i][j]表示以第ii個點為根,容量jj的最優答案.
    • 轉移時,先直接列舉一遍容量轉移兒子,然後再通過兒子轉移自己,後者只需要按位取maxmax
  • 當然還有一種用d

    fndfn序的方法,其實也是類似的:

    • 通過從大到小列舉dfndfn值,然後如果一個點不選,那就直接轉移到i+size[x]i+size[x]去,這裡轉移顯然是取max\max(xx表示dfndfn序為ii的點)
    • 如果選,則直接由f[i+1]f[i+1]轉移過來。
  • 很容易想到直接按照題意加資料結構樹狀陣列模擬,常熟賊小.

  • 然而實際上,這是一道可以僅憑耐心做出來的題,仔細觀察每當下標往右移一位時,所有數與下標相減的變化.

  • 是可以做到O(n)O(n)的。

2018.9.18

  • 直接列舉子樹大小kk,然後判斷是否有n

    k\frac{n}{k}個點的節點的sizesizekk的倍數.

  • O(nlogn)O(nlogn).

2018.10.6

  • 點分治裸題.

  • 先計算小於等於S1S-1的路徑方案數。

  • 二分一個在SES\sim E中的閾值TT,再看看減去S1S-1的方案是否還有即可.

  • 一道極其猥瑣的搜尋題.

  • 好吧,實際上是我太弱.

  • 我們可以加很多個優化,然鵝依然無法在1s的時間內通過這道題.

  • 所以實際上需要一個記憶化!!! 我們可以設f[i][S]f[i][S]表示還剩下ii個人沒有配對成功,剩下ii個人的hash狀態為S

    S時這個方案是否可行。

  • 這樣直接搜尋,事實上是比較複雜的.

  • 然鵝我們可以用搜尋套搜尋的方式去更加簡潔地實現.

  • 點分樹強悍做法.

  • 假設現在詢問只有一個,那麼一個極顯然的做法就是二分一下答案ansans,然後點分治即可.

  • 詢問有mm個,所以我們需要強悍的點分樹.

  • 我們處理好每個分治中心管轄的範圍,然後對於每一個詢問,我們像先前一樣二分ans.

  • 只不過這個時候,我們要在log2log^2的時限內達到.

  • 也很簡單,我們統計過當前詢問點,以及過它所在的分治中心(總共有log個)的條數.

  • 也就是直接在那個分治中心的管轄範圍的序列上二分即可.

  • 因為這樣會算重,所以對於每一個點,我們需要算兩遍:

    • 在最近的一個分治中心算一遍,加上
    • 再在第二近的分治中心算一遍,減去
    • 注意兩遍的depth陣列是不一樣的…
  • 這種點分樹的方法非常強大,需要好好領悟.

  • 然而大佬lzw提供了一種它的牛逼二分方法,這種方法時間複雜度與上面做法是一樣的,都是O(nlog2n)O(nlog^2n).

  • 事實上,可以對於每一個點分別記錄兩個值l,rl,r,然後類似二分答案一樣,不過對於每個點二分的答案都不一樣,對於每個點,要二分的值實際上是l+r>>1l+r>>1.

  • 這樣做完一遍樹分治之後,調整l,rl,r的值,即如果一個點已經得到的路徑數多了,那就把rr改小,否則把ll增大.

2018.11.1

  • 因為有關位運算,很容易想到按位處理.

  • 因為是與運算,所以沒進行一次計算,11的個數只會減少而不會增多.

  • 那麼可以線上段樹上暴力修改,每修改一次,11的個數都只會減少,否則沒有必要往下修改嘛.

  • 所以勢能分析一波,就是O(nlog2n)O(nlog^2n)的了。

2018.11.2

  • 考慮最簡單的氣泡排序.

  • 每次找到最左邊的一對相鄰逆序對進行交換,直到沒有為止,線段樹的每個葉節點相當於是一個01狀態表示與其相鄰點(下一個點)是否需要交換.

  • 同樣是勢能分析,同樣是線段樹上操作,哎。。。

  • 又是一年DP題.

  • 注意到題目最重要的一個性質:點度數10\le 10.

  • 那麼容易想到狀壓一個點連出去的邊.

  • 現在考慮以kk然後考慮一條非樹邊進行的影響,至多是兩條邊,且會產生一個貢獻,把這看成一個物品(也是一種物品).

  • 另一種物品則是一條邊不被非樹邊覆蓋時的貢獻,其實就是子樹的f最大值.

  • 然後揹包一下即可.

  • 原諒我這是口胡的,所以只有自己能看懂。。。

  • 略屌的一道貪心題.

  • 考慮樹上權值最大的點,必定是在其父親染色完之後立刻染色,那麼實質上可以把這兩個點合併起來,權值為兩點權值的平均值

  • 一直做下去,以後新產生的點,權值就是所有原始權值除以點數.

  • 我發現自己做這種需要一點點智商的題很弱啊.

  • 還是需要多思考.

  • 類似對頂堆,我們搞一個“對頂棧”.

  • 游標的左移和右移實質上都可以轉化為兩個棧棧頂的變化.

2018.11.8

  • 要把STS-\rightarrow T,那麼考慮SS中一些相同的數.

  • 這些S[i]S[i]要移到的位置其實是知道的,對應TT串的順序,如S={1,2,3,2,1},T={2,1,3,1,2}S=\{1,2,3,2,1\}, T=\{2,1,3,1,2\}

  • 那麼第一個11就要移到第22個位置,第二個11就要移到第44個位置,把SS串的每個位置用其對應位置表示,容易發現,這個新序列的逆序對個數就是答案了!

  • 很經典的一道題,先考慮二維。

  • 然後轉化到三維,令f[i]f[i]表示到第ii個點,且不經過以前所有點的方案數.

  • 直接用總方案減去不合法就行了.

  • 假設從一個點(0,0,0)(n,n,n)(0,0,0)\rightarrow (n,n,n),總方案必定是(3nn)(2nn)\binom{3n}{n}*\binom{2n}{n}