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

2021-08-16 12:10:34 字數 2279 閱讀 7089

description

a 國共有 n 座城市,這些城市由 n-1 條道路相連,使得任意兩座城市可以互達,且路徑唯一。每座城市都有乙個

幸運數字,以紀念碑的形式矗立在這座城市的正中心,作為城市的象徵。一些旅行者希望遊覽 a 國。旅行者計畫 乘飛機降落在 x 號城市,沿著 x

號城市到 y 號城市之間那條唯一的路徑遊覽,最終從 y 城市起飛離開 a 國。

在經過每一座城市時,遊覽者就會有機會與這座城市的幸運數字拍照,從而將這份幸運儲存到自己身上。然而,幸

運是不能簡單疊加的,這一點遊覽者也十分清楚。他們迷信著幸運數字是以異或的方式保留在自己身上的。例如, 遊覽者拍了 3 張**,幸運值分別是

5,7,11,那麼最終保留在自己身上的幸運值就是 9(5 xor 7 xor 11)。

有些聰明的遊覽者發現,只要選擇性地進行拍照,便能獲得更大的幸運值。例如在上述三個幸運值中,只選擇 5 和 11 ,可以保留的幸運值為 14

。現在,一些遊覽者找到了聰明的你,希望你幫他們計算出在他們的行程安排中 可以保留的最大幸運值是多少。

input

第一行包含 2 個正整數 n ,q,分別表示城市的數量和旅行者數量。第二行包含 n 個非負整數,其中第 i 個整 數 gi 表示 i

號城市的幸運值。隨後 n-1 行,每行包含兩個正整數 x ,y,表示 x 號城市和 y 號城市之間有一 條道路相連。隨後 q

行,每行包含兩個正整數 x ,y,表示這名旅行者的旅行計畫是從 x 號城市到 y 號城市。n

<=20000,q<=200000,gi<=2^60

output

輸出需要包含 q 行,每行包含 1 個非負整數,表示這名旅行者可以保留的最大幸運值。

sample input

4 2

11 5 7 9

1 2

1 3

1 4

2 3

1 4

sample output

14

題解

全程%超級大佬

學了新東西線性基,可以用log(max(a[i]))的數表達出a[i]這個集合的異或值域

這題可以考慮樹上倍增,倍增的時候暴力合併兩個線性基

路徑是唯一的所以就lca搞一下這個路徑上的線性基,之後貪心地輸出

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

struct node

a[41000];int len,last[21000];

void ins(int x,int y)

int n,fa[21000][21],dep[21000],q;

ll f[21000][21][65],bin[65];

void merge(ll *a,ll u)

else u^=a[i];}}

}void merge_all(ll *a,ll *b)

void pre_tree_node(int x)

for(int k=last[x];k;k=a[k].next)

}}ll ans[65];

void sol(int x,int y)

for(int i=20;i>=0;i--)if(bin[i]<=dep[x] && fa[x][i]!=fa[y][i])merge_all(ans,f[x][i]),merge_all(ans,f[y][i]),x=fa[x][i],y=fa[y][i];

merge_all(ans,f[x][0]);merge_all(ans,f[y][0]);

merge_all(ans,f[fa[x][0]][0]);

return ;

}int main()

for(int i=1;iint x,y;

scanf("%d%d",&x,&y);

ins(x,y);ins(y,x);

}fa[1][0]=0;dep[1]=1;pre_tree_node(1);

while(q--)

return

0;}

學習線性基 bzoj 4568 幸運數字

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

BZOJ4568 線性基 樹鏈剖分 線段樹

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

bzoj5293 樹上倍增 求和

description master 對樹上的求和非常感興趣。他生成了一棵有根樹,並且希望多次詢問這棵樹上一段路徑上所有節點深度的k 次方和,而且每次的k 可能是不同的。此處節點深度的定義是這個節點到根的路徑上的邊數。他把這個問題交給 了pupil,但pupil 並不會這麼複雜的操作,你能幫他解決嗎...