1. 程式人生 > 其它 >python常用的日期和時間模組

python常用的日期和時間模組

所謂長鏈剖分,就是給每個節點標記一個深度最深的長兒子。

長鏈剖分的優勢:對於可以 $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)$ 繼承與深度有關的資訊。

對於長鏈剖分,樹上差分很有用哦~