樹上莫隊非詳解

2022-05-07 18:54:09 字數 1146 閱讀 7655

樹分塊,像王室聯邦一樣

然後怎麼移動端點

蒯\(vfk\)的部落格:

用s(v, u)代表 v到u的路徑上的結點的集合。

用root來代表根結點,用lca(v, u)來代表v、u的最近公共祖先。

那麼s(v, u) = s(root, v) xor s(root, u) xor lca(v, u)

其中xor是集合的對稱差。

簡單來說就是節點出現兩次消掉。

lca很討厭,於是再定義

t(v, u) = s(root, v) xor s(root, u)

觀察將curv移動到targetv前後t(curv, curu)變化:

t(curv, curu) = s(root, curv) xor s(root, curu)

t(targetv, curu) = s(root, targetv) xor s(root, curu)

取對稱差:

t(curv, curu) xor t(targetv, curu)= (s(root, curv) xor s(root, curu)) xor (s(root, targetv) xor s(root, curu))

由於對稱差的交換律、結合律:

t(curv, curu) xor t(targetv, curu)= s(root, curv) xors(root, targetv)

兩邊同時xor t(curv, curu):

t(targetv, curu)= t(curv, curu) xor s(root, curv) xor s(root, targetv)

發現最後兩項很爽……哇哈哈

t(targetv, curu)= t(curv, curu) xor t(curv, targetv)

(有公式恐懼症的不要走啊 t_t)

也就是說,更新的時候,xor t(curv, targetv)就行了。

即,對curv到targetv路徑(除開lca(curv, targetv))上的結點,將它們的存在性取反即可。

直接暴力取反就好了,計算答案時算上lca,就是改一下,之後再改回去

不帶修改

塊大小為根號n

排序注意要保證dfn[u]帶修改

塊大小為\(n^}\)

排序v也按照塊

最後比時間

樹上莫隊演算法

繼續回來寫部落格 記錄點有意思的題目什麼的。貌似寫過這個的沒多少人 所以我也記錄一點。首先序列上的莫隊大家都應該很熟悉了 那麼樹上的莫隊要怎麼搞呢?先來看個題目 spoj cot2 求樹上兩點間路徑上有多少個不同的點權。序列上的莫隊是把詢問按照左端點分塊了 可是樹上沒有左端點,怎麼辦呢?我們把樹分塊...

樹上莫隊演算法

樹上莫隊,顧名思義就是把莫隊搬到樹上。我們從一道題目入手 sdoi2018 原題識別 spoj count on a tree ii 題目意思很明確 給定乙個 n 個節點的樹,每個節點表示乙個整數,問 u 到 v 的路徑上有多少個不同的整數。像這種不帶修改數顏色的題首先想到的肯定是樹套樹莫隊,那麼如...

樹上莫隊演算法

樹上莫隊,顧名思義就是把莫隊搬到樹上。我們從一道題目入手 sdoi2018 原題識別 spoj count on a tree ii 題目意思很明確 給定乙個 n 個節點的樹,每個節點表示乙個整數,問 u 到 v 的路徑上有多少個不同的整數。像這種不帶修改數顏色的題首先想到的肯定是樹套樹莫隊,那麼如...