python常用的日期和時間模組
阿新 • • 發佈:2021-11-24
所謂長鏈剖分,就是給每個節點標記一個深度最深的長兒子。
長鏈剖分的優勢:對於可以 $O(1)$ 從一個兒子繼承所有所需資訊的 dp,用長鏈剖分,更新時直接 $O(1)$ 繼承長兒子的資訊,其餘兒子的資訊暴力繼承即可。
時間複雜度 $O(\sum\limits_{u} \sum\limits_{v \in son_u} len_v)=O(n)$,其中 $len_v$ 為 $v$ 所在長鏈的長度。
那麼,什麼 dp可以 $O(1)$ 從一個兒子繼承所有所需資訊呢?
能想到的只有:維護的資訊僅與深度有關的 dp。
例如,$f[u][j]$ 代表與 $u$ 距離為 $j$ 的節點的數量,$g[u][j]$ 代表與 $u$ 距離為 $j$ 的節點的權值和等等。
怎麼 $O(1)$ 繼承?
維護一個大小為 $O(n)$ 的陣列和一個指標,每次來到長鏈鏈頭 $u$ 時開出一塊長為 $len_u$ 的空間給它,即令 $f_u=pos$。
然後對於長兒子 $son_u$,令 $f_{son(u)}=f_u±1$ 即可 $O(1)$ 繼承與深度有關的資訊。
對於長鏈剖分,樹上差分很有用哦~