線性基合併,倍增
我們考慮一次詢問(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加貪心水掉,但這道題怎麼做呢?線性基就可以...