幸運數字 線性基合併,倍增

2021-10-04 13:48:37 字數 1598 閱讀 6635

線性基合併,倍增

我們考慮一次詢問(x,

y)(x,y)

(x,y),lca

lcalc

a表示他們的最近公共祖先,於是每次求答案時,我們維護x到y的路徑上的數構成的線性基,於是我們考慮倍增處理,每次查詢lca時,也維護出路徑上的線性基,這裡需要用到線性基合併,直接暴力合併即可,線性基合併的複雜度為o(l

og2n

)o(log^2n)

o(log2

n),於是最後的總複雜度為o(q

log3

n)o(qlog^3n)

o(qlog3n)

#include

#define int long long

#define m 100001

using

namespace std;

intread()

for(

;isdigit

(ch)

;ch=

getchar()

) re=

(re<<3)

+(re<<1)

+ch-

'0';

return re*f;

}int nxt[m>>1]

,first[m]

,to[m>>1]

,dep[m]

,g[m][20

][64]

,f[m][21

],tot,n,q,val[m]

,ans[64]

;void

add(

int x,

int y)

void

insert

(int

*p,int x)

x^=p[i];}

}void

merge

(int

*a,int

*b)int

query()

void

dfs(

int u,

int fa)

for(

int i=first[u]

;i;i=nxt[i])}

intgetans

(int x,

int y)}if

(x==y)

for(

int i=

19;i>=

0;i--)if

(f[x]

[i]!=f[y]

[i])

insert

(ans,val[x]),

insert

(ans,val[y]),

insert

(ans,val[f[x][0

]]);

return

query()

;}signed

main()

dfs(1,

0);for

(int i=

1;i<=q;i++

)return0;

}

bzoj4568 樹上倍增 線性基 幸運數字

description a 國共有 n 座城市,這些城市由 n 1 條道路相連,使得任意兩座城市可以互達,且路徑唯一。每座城市都有乙個 幸運數字,以紀念碑的形式矗立在這座城市的正中心,作為城市的象徵。一些旅行者希望遊覽 a 國。旅行者計畫 乘飛機降落在 x 號城市,沿著 x 號城市到 y 號城市之間...

SCOI2016 線性基 幸運數字

本題在樹上,其實可以用trie樹水,我偏要線性基pwp 使用倍增減少複雜度。我們在倍增lca陣列的基礎上多加一維維護線性基。根據線性基性質 qwq 將乙個線性基插入另乙個線性基可以得到兩個數列合併後的線性基。所以我們每次查詢用倍增跳的方式強行合併然後求最大就行。includeusing namesp...

學習線性基 bzoj 4568 幸運數字

好久沒寫部落格了,最近學習了一下新姿勢 線性基,這個就很厲害了。線性基其實很好理解。會線性基可以直接跳過下面的部分。我們先丟擲一道簡單的題 給你乙個長度為n的序列,在其中任選數字求可以得到的最大異或和。我們知道任意兩個,和連續一段的最大異或和,可以用trie加貪心水掉,但這道題怎麼做呢?線性基就可以...