我是 OI 苦手,这就是毒瘤
查看原帖
我是 OI 苦手,这就是毒瘤
515129
TLEWA楼主2024/9/1 17:23

rt,求调 20pts

#include<bits/stdc++.h>
#define int long long 

using namespace std;

const int N=200005;

int n,q;
int G[N];

vector<int> vec[N];

int fa[N][20],dep[N];

struct Node {
	int base[65],pos[65];
	
	void clear() {memset(base,0,sizeof(base));memset(pos,0,sizeof(pos));}
	
	void insert(int p) {
		int x=G[p];
		for(int i=60;i>=0;--i) {
			if(!(x&(1<<i))) continue;
			if(!base[i]) {
				base[i]=x;pos[i]=p;
				break;
			}
			if(dep[p]>dep[pos[i]]) {swap(pos[i],p);swap(x,base[i]);}
			x^=base[i];
		}
	}
	
	int gmax(int x) {
		for(int i=60;i>=0;--i) 
			if((x^base[i])>x) x^=base[i];
		return x;
	}
}arr[N];

void dfs(int u,int father) {
	fa[u][0]=father,dep[u]=dep[father]+1;
	for(int i=0;i<=60;++i) 
		arr[u].pos[i]=arr[father].pos[i],arr[u].base[i]=arr[father].base[i];
	arr[u].insert(u);
	
	for(int i=1;i<20;++i) fa[u][i]=fa[fa[u][i-1]][i-1];
	for(auto v:vec[u]) if(v!=father) {
		dfs(v,u);
	}
}

int lca(int u,int v) {
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=19;~i;--i)
		if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
	if(u==v) return u;
	for(int i=19;~i;--i)
		if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
	return fa[u][0];
}

signed main() {
	cin >> n >> q;
	for(int i=1;i<=n;++i) cin >> G[i];
	
	int u,v;
	for(int i=1;i<n;++i) {
		cin >> u >> v;
		vec[u].push_back(v);
		vec[v].push_back(u);
	}
	dfs(1,0);
	
	int LCA;Node node;
	for(int i=1;i<=q;++i) {
		cin >> u >> v;
		LCA=lca(u,v);
		node.clear();
		
		for(int i=0;i<=60;++i) {
			if(dep[arr[u].pos[i]]>=dep[LCA])
				node.insert(arr[u].pos[i]);
			if(dep[arr[v].pos[i]]>=dep[LCA])
				node.insert(arr[v].pos[i]);
		}
		cout << node.gmax(0) << endl;
	}
	
	return 0;
}

2024/9/1 17:23
加载中...