BZOJ4568 Scoi2016 幸運數字

2022-05-03 22:57:19 字數 2001 閱讀 2554

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 個非負整數,表示這名旅行者可以保留的最大幸運值。

4 2

11 5 7 9

1 2

1 3

1 4

2 3

1 414

11不難發現問題就是每次詢問鏈上線性基的並,我寫的是點分治,這樣只需將兩個字首線性基暴力合併一下就好了。

時間複雜度為o(60(n+q)logn)。

#include#include#include#include#include#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

#define ren for(int i=first[x];i;i=next[i])

using namespace std;

const int buffersize=1<<16;

char buffer[buffersize],*head,*tail;

inline char getchar()

return *head++;

}typedef long long ll;

inline ll read()

const int maxn=20010;

const int maxm=200010;

struct set

val^=a[i];

} }ll query()

}a[maxn];

int n,m,first[maxn],next[maxn<<1],to[maxn<<1],e;

ll val[maxn],ans[maxm];

void addedge(int u,int v)

int qx[maxm],qy[maxm],q[maxm];

int vis[maxn],f[maxn],s[maxn],root,size;

void getroot(int x,int fa)

int bel[maxn],cur;

void dfs(int x,int fa)

int cmp(int x,int y) else q[++n]=q[i];h=n;

if(f>h) return;

sort(q+f,q+h+1,cmp);

ren if(!vis[to[i]])

ren if(!vis[to[i]])

}int main()

BZOJ4568 Scoi2016 幸運數字

樹上查兩點間最大異或和 樹倍增,每個點維護向上2 k個點的線性基,然後在查lca的時候合併 關於點權維護倍增略蛋疼 合併線性基的時候就直接把乙個線性基里的插到另乙個裡 複雜度o m log n log 2inf 合併的時候加點優化可以降掉乙個loginf 接下來bb一些有關線性基和最大異或和的東西 ...

BZOJ 4568 Scoi2016 幸運數字

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

BZOJ 4568 Scoi2016 幸運數字

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