56分,求调
查看原帖
56分,求调
748723
wang_ly_ly楼主2023/12/17 23:44

写的dfs序,56分,wa9~14

#include<iostream>
#include<vector>
using namespace std;
long long t[4*200005],qzh[200005],id[200005],w[200005],wd[200005],cnt,ed[200005],o[200005*4],f[200005][21],dep[200005];
vector<long long>e[200005];
void dfs(long long x,long long fa){
	cnt++;
	id[x]=cnt;
	wd[cnt]=w[x];
	qzh[cnt]=qzh[id[fa]]^w[x];
	dep[x]=dep[fa]+1;
	f[x][0]=fa;
	for(long long i=1;i<=20;i++){
		f[x][i]=f[f[x][i-1]][i-1];
	}
	for(long long i=0;i<e[x].size();i++){
		if(e[x][i]!=fa)dfs(e[x][i],x);
	}
	ed[x]=cnt;
}
void build(long long l,long long r,long long z){
	if(l==r){
		t[z]=qzh[l];
		return;
	}
	long long mid=(l+r)>>1;
	build(l,mid,z<<1);
	build(mid+1,r,z<<1|1);
	t[z]=t[z<<1]^t[z<<1|1];
}
void pushdown(long long l,long long r,long long z){
	if(o[z]){
	    int mid=(l+r)/2;
		if((mid-l+1)%2)t[z<<1]^=o[z];
		if((r-mid)%2)t[z<<1|1]^=o[z];
		o[z<<1]^=o[z];
		o[z<<1|1]^=o[z];
		o[z]=0;
	}
}
void xg(long long l,long long r,long long x,long long y,long long z,long long k){
	if(l<=x&&y<=r){
		t[z]^=k;
		o[z]^=k;
		return;
	}
	pushdown(l,r,z);
	long long mid=(x+y)>>1;
	if(mid>=l)xg(l,r,x,mid,z<<1,k);
	if(mid<r)xg(l,r,mid+1,y,z<<1|1,k);
//	t[z]=t[z<<1]^t[z<<1|1];
}
long long cx(long long l,long long r,long long x,long long z){
	if(l==x&&r==x){
		return t[z];
	}
	pushdown(l,r,z);
	long long mid=(l+r)>>1;
	if(mid>=x){
//		t[z]=t[z<<1]^t[z<<1|1];
		return cx(l,mid,x,z<<1);
	}
	else{
//		t[z]=t[z<<1]^t[z<<1|1];
		return cx(mid+1,r,x,z<<1|1);
	}
}
long long lca(long long x,long long y){
	if(dep[x]>dep[y])swap(x,y);
	for(long long i=20;i>=0;i--){
		if(dep[f[y][i]]>=dep[x])y=f[y][i];
	}
//	cout<<x<<" "<<y<<"\n";
	if(x==y)return x;
	for(long long i=20;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int main(){
	long long n,q;
	cin>>n>>q;
	for(long long i=1;i<=n;i++)cin>>w[i];
	for(long long i=1;i<n;i++){
		long long x,y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1,0);
	build(1,n,1);
	while(q--){
		long long o,x,y;
		cin>>o>>x>>y;
		if(o==1)xg(id[x],ed[x],1,n,1,cx(1,n,id[x],1)^y);
		else{
			long long lc=lca(x,y);
			if(lc==1)cout<<(cx(1,n,id[x],1)^cx(1,n,id[y],1)^cx(1,n,id[lc],1))<<"\n";
			else cout<<(cx(1,n,id[x],1)^cx(1,n,id[y],1)^cx(1,n,id[lc],1)^cx(1,n,id[f[lc][0]],1))<<"\n";
		}
	}
	return 0;
} 
2023/12/17 23:44
加载中...