分治在於剔除重復。
“如無必要,勿增實體” (Entities should not be multiplied unnecessarily)
樹上的log是輕重兒子,啟發式合並。
而序列上則是分治。
線段樹本身就是一種分治。
序列上的分治是二分。樹結構其實可以看成特殊的序列。
而分治本身在於繼承。
繼承是為了不必重復計算。類比記憶化搜索。
序列上,如CDQ分治,如奇襲,本質上都是多對多地共用已經處理出來的信息。而不是每一次去單獨算。
仔細想想樹狀數組之所以能快也是種信息共享的結構。
樹狀數組:單點修改,區間查詢。改為差分數組可做到區間修改,單點查詢。
同時序列上的二分,mid能覆蓋所有中間分割位置。
實際上原本是n^2的點對,每對點都有關系。通過二分(實際上是枚舉斷點(分為 貢獻—接受 部分))使接受的部分能夠共享貢獻的部分的貢獻。
實現的關鍵在於1、每個點都對整個序列有影響。(n^2點對)。則可以分出接受和貢獻的部分。
2、每個點的貢獻可以單獨計算。不能單獨算可以考慮公式移項。(奇襲,天天愛跑步)。
在增加數值,查詢數值時,可以考慮數據結構維護(CDQ的樹狀數組)。或者只用一個數組或桶。
對於區間,我們可以分為內部和外部來討論,從而寫出分治。那么對於樹,我們也可以分為子樹內部,子樹對根,(可能還有子樹對子樹)來考慮。
如果要先處理所有子樹信息,再處理根節點,且子樹的信息要累加到根上,且信息處理有繼承關系:
1、每個節點開空間記錄所有信息。
2、為了降低復雜度,可以繼承信息多的部分,從而做到每次只額外增加較少的信息,處理較少的信息。
根據輕重子樹分(輕重根據信息分,而非子樹大小),可以每次增加不超過1/2.
從而實現log的復雜度。
二:同類信息的簡化
背包DP中有數量物品的二進制拆分。
三:運動與轉移
造成重復的除了信息,還有運動/變化/轉移。為了簡化若干相同的連續的轉移,出現了快速冪、矩陣快速冪。
而它們的必要條件是轉移滿足結合律。
順便一提,快速冪是把底數的乘法變為指數的加法,並且自乘相當於指數乘2,二進制中即為左移一位。
如果一個個乘,相當於把base又算了一遍。乘法本身就是對加法的優化,用兩個較小的數表示一個較大的數。擴展到快速冪就是讓指數乘2。
類似的還有lca抬根(ST表)。也是對一系列不斷重復操作(向上抬)的簡化。ST表既可lca抬根優化轉移,也可RMQ存儲區間信息。
大體來說,對於轉移的簡化重復,一是快速冪從低位到高位枚舉二進制,二是lca抬根的二進制從高位到低位拼湊。
LAST:
尋找冗余。
信息是物質,轉移是運動。剔除重復。避免不必要的事、物。