a 國共有 n 座城市,這些城市由 n-1 條道路相連,使得任意兩座城市可以互達,且路徑唯一。每座城市都有乙個幸運數字,以紀念碑的形式矗立在這座城市的正中心,作為城市的象徵。
一些旅行者希望遊覽 a 國。旅行者計畫乘飛機降落在 x 號城市,沿著 x 號城市到 y 號城市之間那條唯一的路徑遊覽,最終從 y 城市起飛離開 a 國。在經過每一座城市時,遊覽者就會有機會與這座城市的幸運數字拍照,從而將這份幸運儲存到自己身上。然而,幸運是不能簡單疊加的,這一點遊覽者也十分清楚。他們迷信著幸運數字是以異或的方式保留在自己身上的。
例如,遊覽者拍了 3 張**,幸運值分別是 5,7,11,那麼最終保留在自己身上的幸運值就是 9(5 xor 7 xor 11)。
有些聰明的遊覽者發現,只要選擇性地進行拍照,便能獲得更大的幸運值。例如在上述三個幸運值中,只選擇 5 和 11 ,可以保留的幸運值為 14 。現在,一些遊覽者找到了聰明的你,希望你幫他們計算出在他們的行程安排中可以保留的最大幸運值是多少。
輸入格式:
第一行包含 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
輸出格式:
輸出需要包含 q 行,每行包含 1 個非負整數,表示這名旅行者可以保留的最大幸運值。
輸入樣例#1:
4 211 5 7 9
1 21 3
1 42 3
1 4輸出樣例#1:
1411
題解:看到求最大異或和,可能會想到線性基.(事實上我也想不到什麼其他的東西)
沒錯,我們就用線性基來做.
我們在每個節點上維護乙個線性基,並且像倍增一樣維護乙個向上\(2^j\)距離的線性基,然後每次詢問倍增\(lca\)一下就可以了.
需要注意一下的就是因為\(lca\)的倍增陣列是乙個左閉右開的區間,也就是說我們在跳到\(lca\)的時候還需要多合併一下線性基(因為線性基是左閉右閉的區間).
具體時間複雜度我感覺有點奇怪,大概是\(m*logn*60^2\)吧....反正就是能過.
#includeusing namespace std;
const int n = 2e4+5;
typedef int _int;
#define int long long
int n, m, last[n], ecnt = 0, v[n], gup[16][n], dep[n];
struct edgee[n*2];
struct basis
void insert(int val)}}
}int query()
void clear()
}b[16][n], ans;
int gi()
while(i >= '0' && i <= '9') res = res*10+i-'0', i = getchar();
return res*f;
}void add(int x, int y)
void dfs(int x, int deep, int f)
basis merge(basis x, basis y)
void init()
}int lca(int x, int y)
for(int i = 15; i >= 0; i--)
if(gup[i][x] != gup[i][y])
ans = merge(merge(ans, b[0][gup[0][x]]), merge(b[0][x], b[0][y]));
return gup[0][x];
}_int main()
return 0;
}
P3292 SCOI2016 幸運數字
lca倍增的途中,merge一下線性基。注意線性基是從自己開始,而倍增陣列fa i 0 等於father,意味著,線性基倍增的區間是左閉右開的,fa陣列是左閉右閉 include include include include include include include include incl...
P3292 SCOI2016 幸運數字 題解
這道題的解法是倍增 lca 線性基。下面假設你已經學會了倍增 lca 和線性基。首先回顧倍增 lca 的過程 通過倍增合併 f 到 f 上。實際上線性基也是可以合併的,合併方式就是將乙個線性基插入到另外乙個線性基裡面。因此既然線性基可以合併,那麼根據倍增 lca 的思路,我們同樣可以倍增合併線性基。...
洛谷P3293 SCOI2016 美味
一家餐廳有 n 道菜,編號 1.n 大家對第 i 道菜的評價值為 ai 1 i n 有 m 位顧客,第 i 位顧客的期望值為 bi,而他的偏好值為 xi 因此,第 i 位顧客認為第 j 道菜的美味度為 bi xor aj xi xor 表示異或運算。第 i 位顧客希望從這些菜中挑出他認為最美味的菜,...