40pts MLE,被卡常求调
查看原帖
40pts MLE,被卡常求调
477821
toolong114514楼主2024/3/20 17:17
#include<iostream>
#include<cstring>
using namespace std;
const int N=2e4+2;
const int INF=0x7fffffff;
struct node{
	int to,nxt;
}edge[2*N];
int head[N];
int cnt;
inline void add(int u,int v){
	edge[++cnt]={v,head[u]};
	head[u]=cnt;
}
long long vv[N];
int dep[N];
struct ccf{
	long long val;
	bool vsv;
}ans[N][17][65],tmp[65];
int st[N][17];
inline void dfs(register int x,register int last){
	st[x][0]=last;
	dep[x]=dep[last]+1;
	for(register int i=60;i>=0;i--){
		if(vv[x]&(1ll<<(long long)(i))){
			ans[x][0][i].val=vv[x];
			ans[x][0][i].vsv=true;
			break;
		}
	}
	int xh=vv[last];
	for(register int i=60;i>=0;i--){
		if(xh&(1ll<<(long long)(i))){
			if(ans[x][0][i].vsv==false){
				ans[x][0][i].vsv=true;
				ans[x][0][i].val=xh;
				break;
			}else{
				xh^=ans[x][0][i].val;
			}
		}
	}
	for(register int i=head[x];i!=-1;i=edge[i].nxt){
		if(edge[i].to!=last) dfs(edge[i].to,x);
	}
}
int n,q;
inline void build(){
	for(register int j=1;j<=16;j++){
		for(register int i=1;i<=n;i++){
			if(dep[i]<=(1<<j)) continue;
			st[i][j]=st[st[i][j-1]][j-1];
			for(register int t=0;t<=60;t++){
				ans[i][j][t]=ans[i][j-1][t];
			}
			for(register int t=60;t>=0;t--){
				long long sb=ans[st[i][j-1]][j-1][t].val;
				for(register int tt=60;tt>=0;tt--){
					if(sb&(1ll<<(long long)(tt))){
						if(ans[i][j][tt].vsv==false){
							ans[i][j][tt].vsv=true;
							ans[i][j][tt].val=sb;
							break;
						}else{
							sb^=ans[i][j][tt].val;
						}
					}
				}
			}
		}
	}
}
inline void ins(register int x,register int y){
	for(register int i=0;i<=60;i++){
		long long sb=ans[x][y][i].val;
		for(register int j=60;j>=0;j--){
			if(sb&(1ll<<(long long)(j))){
				if(tmp[j].vsv==false){
					tmp[j].val=sb;
					tmp[j].vsv=true;
					break;
				}else{
					sb^=tmp[j].val;
				}
			}
		}
	}
}
signed main(){
	ios::sync_with_stdio(false);
	memset(head,-1,sizeof(head));
	cin>>n>>q;
	for(register int i=1;i<=n;i++){
		cin>>vv[i];
	}
	for(register int i=1;i<n;i++){
		register int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs(1,0);
	build();
	while(q--){
		for(register int i=0;i<=60;i++){
			tmp[i]={0,false};
		}
		register int x,y;
		cin>>x>>y;
		if(x==y){
			cout<<vv[x]<<'\n';
			continue;
		}
		if(dep[x]<dep[y]) swap(x,y);
		for(register int j=16;j>=0;j--){
			if((1<<j)<=dep[x]&&dep[st[x][j]]>=dep[y]){
				ins(x,j);
				x=st[x][j];
			}
		}
		if(x!=y){
			for(register int j=16;j>=0;j--){
				if((1<<j)<dep[x]&&st[x][j]!=st[y][j]){
					ins(x,j);
					ins(y,j);
					x=st[x][j];
					y=st[y][j];
				}	
			}
			ins(x,0);
			ins(y,0);
		}
		register long long zyh=0;
		for(register int i=60;i>=0;i--){
			if((zyh^tmp[i].val)>zyh) zyh^=tmp[i].val;
		}
		cout<<zyh<<'\n';
	}
	return 0;
}
//https://cdn.luogu.com.cn/upload/image_hosting/tzx2cdx4.png
2024/3/20 17:17
加载中...