BZOJ4568 Scoi2016 幸運數字

2021-07-11 17:23:44 字數 892 閱讀 8948

樹上查兩點間最大異或和

樹倍增,每個點維護向上2^k個點的線性基,然後在查lca的時候合併

關於點權維護倍增略蛋疼-_-

合併線性基的時候就直接把乙個線性基里的插到另乙個裡

複雜度o(m log n log^2inf)

合併的時候加點優化可以降掉乙個loginf

接下來bb一些有關線性基和最大異或和的東西……

首先線性基是乙個擬陣,遺傳性顯然,交換性可以把大的裡邊找乙個小的裡沒有的位,小的裡因為別的位有1所以一定不能表示出這一位,所以還是線性基,所以有交換性

然後找最大異或和就是,線性基保證每個數都不會被消掉,並且從高位到低位貪心,高位能放一定放高位,取max的意思就是判斷之前有沒有這一位

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn 20010

#define maxm 17

#define ll long long

#define inf 1000000000

#define mod 1000000007

#define eps 1e-8

struct vec;

struct bas

inline void ins(ll x)

} for(i=16;i;i--)

} if(x!=y)

return re;

}bas bask(int x,int y)

while(x!=y)

return re;

}int main()

for(i=1;i

BZOJ 4568 Scoi2016 幸運數字

題目大意 給你一顆樹,多個詢問,問你樹上任意兩點的路徑上選任意幾個點使得異或和最大。我是參考的claris大神的 點分治,對於詢問在兩個子樹間或者有乙個在重心上的進行回答,否則把問題用鍊錶接到詢問點所在的子樹上。具體方法可以選中重心都對每個子樹染色,染為這個子樹的根節點。在子樹處理問題之前一定要記住...

BZOJ 4568 Scoi2016 幸運數字

可以合併的東西都是人類互相傷害的 參照cogs上採礦那道題 可以用樹剖維護線性基,複雜度q logn 2 logw 2 顯然會t。考慮到沒有修改 用點分治離線來做 乙個詢問如果經過當前分治根,則立即處理並不再下傳,否則下傳到相應子樹去做 複雜度nlognlogw qlogwlogw include ...

BZOJ4568 Scoi2016 幸運數字

線性基 倍增 lca 抑或和最大的問題顯然要用到線性基。本題就直接倍增維護線性基,合併出答案即可。線性基的合併就是乙個插入到另乙個中。有一點小細節就是lb i j 中維護的是從i到i的2j 級祖先的線性基,左開右閉,也就是不包括i本身的。因此查lc a a,b 的時候先把a和b的插入進去。code ...