40pts,空间被卡常,MLE求调
查看原帖
40pts,空间被卡常,MLE求调
477821
toolong114514楼主2024/3/23 15:45
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
#define int long long
const int N=2e4+10;
struct node{
	short to;
	node *nxt;
};
node *ssh[N];
void add(short u,short v){
	node *ne=new node;
	ne->to=v;
	ne->nxt=ssh[u];
	ssh[u]=ne;
}
struct ccf{
	bool vsv;
	int val;
}ans[N][18][62],tmp[62];
short st[N][18];
int vv[N];
short dep[N];
inline void dfs(register short x,register short last){
	dep[x]=dep[last]+1;
	st[x][0]=last;
	long long xh=vv[x];
	for(register short i=60;i>=0;i--){
		if(xh&(1ll<<((long long)(i)))){
			if(!ans[x][0][i].vsv){
				ans[x][0][i].vsv=true;
				ans[x][0][i].val=xh;
				break;
			}else{
				xh^=ans[x][0][i].val;
			}
		}
	}
	if(last){
		xh=vv[last];
		for(register short i=60;i>=0;i--){
			if(xh&(1ll<<((long long)(i)))){
				if(!ans[x][0][i].vsv){
					ans[x][0][i].vsv=true;
					ans[x][0][i].val=xh;
					break;
				}else{
					xh^=ans[x][0][i].val;
				}
			}
		}
	}
	for(node *i=ssh[x];i!=NULL;i=i->nxt){
		if(i->to==last) continue;
		dfs(i->to,x);
	}
}
int n,q;
inline void build(){
	for(register short j=1;j<=17;j++){
		for(register short i=1;i<=n;i++){
			st[i][j]=st[st[i][j-1]][j-1];
			for(register short t=0;t<=60;t++){
				ans[i][j][t]=ans[i][j-1][t];
			}
			for(register short t1=0;t1<=60;t1++){
				if(!ans[st[i][j-1]][j-1][t1].vsv) continue;
				long long sb=ans[st[i][j-1]][j-1][t1].val;
				for(short t2=60;t2>=0;t2--){
					if(sb&(1ll<<(long long)(t2))){
						if(!ans[i][j][t2].vsv){
							ans[i][j][t2].vsv=true;
							ans[i][j][t2].val=sb;
							break;
						}else{
							sb^=ans[i][j][t2].val;
						}
					}
				}
			}
		}
	}
}
inline void ins(int x,int y){
	for(register short i=0;i<=60;i++){
		if(!ans[x][y][i].vsv) continue;
		int sb=ans[x][y][i].val;
		for(register short j=60;j>=0;j--){
			if(sb&(1ll<<(long long)(j))){
				if(!tmp[j].vsv){
					tmp[j].vsv=true;
					tmp[j].val=sb;
					break;
				}else{
					sb^=tmp[j].val;
				}
			}
		}
	}
}
inline int ask(int x,int y){
	if(x==y) return vv[x];
	for(register short i=0;i<=60;i++){
		tmp[i]={false,0};
	}
	if(dep[x]<dep[y]) swap(x,y);
	for(register short j=17;j>=0;j--){
		if(dep[st[x][j]]>=dep[y]){
			ins(x,j);
			x=st[x][j];
		}
	}
	if(x!=y){
		for(register short j=17;j>=0;j--){
			if(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);
	}
	long long zyh=0;
	for(register short i=60;i>=0;i--){
		if((zyh^tmp[i].val)>zyh) zyh^=tmp[i].val;
	}
	return zyh;
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>q;
	for(register short i=1;i<=n;i++){
		cin>>vv[i];
	}
	for(register short i=1;i<n;i++){
		register short xx,yy;
		cin>>xx>>yy;
		add(xx,yy);
		add(yy,xx);
	}
	dfs(1,0);
	for(register short i=1;i<=n;i++){
		while(ssh[i]!=NULL){
			node *tt=ssh[i];
			ssh[i]=ssh[i]->nxt;
			delete tt;
		}
		delete ssh[i];
	}
	build();
	while(q--){
		register short xx,yy;
		cin>>xx>>yy;
		cout<<ask(xx,yy)<<'\n';
	}
	return 0;
}
2024/3/23 15:45
加载中...