這道題的解法是倍增 lca + 線性基。
下面假設你已經學會了倍增 lca 和線性基。
首先回顧倍增 lca 的過程:通過倍增合併 \(f_\) 到 \(f_\) 上。
實際上線性基也是可以合併的,合併方式就是將乙個線性基插入到另外乙個線性基裡面。
因此既然線性基可以合併,那麼根據倍增 lca 的思路,我們同樣可以倍增合併線性基。
設 \(p_\) 表示第 \(i\) 個節點向上跳 \(2^\) 步之後路徑上的所有節點所構成的線性基。
那麼首先可以通過預處理 lca 預處理出所有的線性基。
然後對於一組詢問 \((x,y)\),考慮在求 lca 的時候邊跳 \(x,y\) 邊合併線性基,然後對於合併完成的線性基求一次最大值就好。
code:github codebase-of-plozia p3292 [scoi2016]幸運數字.cpp
P3292 SCOI2016 幸運數字
lca倍增的途中,merge一下線性基。注意線性基是從自己開始,而倍增陣列fa i 0 等於father,意味著,線性基倍增的區間是左閉右開的,fa陣列是左閉右閉 include include include include include include include include incl...
洛谷P3292 SCOI2016 幸運數字
a 國共有 n 座城市,這些城市由 n 1 條道路相連,使得任意兩座城市可以互達,且路徑唯一。每座城市都有乙個幸運數字,以紀念碑的形式矗立在這座城市的正中心,作為城市的象徵。一些旅行者希望遊覽 a 國。旅行者計畫乘飛機降落在 x 號城市,沿著 x 號城市到 y 號城市之間那條唯一的路徑遊覽,最終從 ...
Luogu 3292 SCOI2016 幸運數字
bzoj 4568。感覺很板。前置技能 線性基。放一篇感覺講的比較豐富的部落格 戳這裡。首先要求在乙個序列中任意選點使得異或和最大,當然是想到線性基了。把問題轉換到樹上,如果每次詢問的序列是兩點之間的路徑,也就是說我們只要提取出樹上一條路徑的線性基就可以了吧。發現線性基滿足可以快速合併這個性質,如果...