社区讨论

没过样例全 RE 求调

P6225[eJOI 2019] 异或橙子参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mlm03on7
此快照首次捕获于
2026/02/14 15:34
5 天前
此快照最后确认于
2026/02/17 21:20
前天
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int f[100001],g[100001],m,n,n1,n2,sum1[400001],sum2[400001],x,y,z;
void build1(int k,int l,int r,int mid){
	if(l==r){
		sum1[k]=f[mid];
		return;
	}
	build1(k<<1,l,mid,(l+mid)>>1);
	build1(k<<1|1,mid+1,r,(mid+1+r));
	sum1[k]=sum1[k<<1]^sum1[k<<1|1];
	return;
}
void build2(int k,int l,int r,int mid){
	if(l==r){
		sum2[k]=g[mid];
		return;
	}
	build2(k<<1,l,mid,(l+mid)>>1);
	build2(k<<1|1,mid+1,r,(mid+1+r));
	sum2[k]=sum2[k<<1]^sum2[k<<1|1];
	return;
}
void change1(int k,int l,int r,int mid){
	if(l==r){
		sum1[k]=y;
		return;
	}
	if(mid>=x)change1(k<<1,l,mid,(l+mid)>>1);
	else change1(k<<1|1,mid+1,r,(mid+1+r)>>1);
	sum1[k]=sum1[k<<1]^sum1[k<<1|1];
	return;
}
void change2(int k,int l,int r,int mid){
	if(l==r){
		sum2[k]=y;
		return;
	}
	if(mid>=x)change2(k<<1,l,mid,(l+mid)>>1);
	else change2(k<<1|1,mid+1,r,(mid+1+r)>>1);
	sum2[k]=sum2[k<<1]^sum2[k<<1|1];
	return;
}
int query1(int k,int l,int r,int mid,int ans){
	if(l>=x&&r<=y)return sum1[k];
	if(mid>=x)ans=query1(k<<1,l,mid,(l+mid)>>1,0);
	if(mid<y)ans^=query1(k<<1|1,mid+1,r,(mid+1+r)>>1,0);
	return ans;
}
int query2(int k,int l,int r,int mid,int ans){
	if(l>=x&&r<=y)return sum2[k];
	if(mid>=x)ans=query2(k<<1,l,mid,(l+mid)>>1,0);
	if(mid<y)ans^=query2(k<<1|1,mid+1,r,(mid+1+r)>>1,0);
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	n1=(n+1)>>1,n2=n>>1;
	for(int i=1;i<=n;i++){
		if(i&1)scanf("%d",&f[(i+1)>>1]);
		else scanf("%d",&g[i>>1]);
	}
	build1(1,1,n1,(1+n1)>>1);
	build2(1,1,n2,(1+n2)>>1);
	while(m--){
		scanf("%d%d%d",&z,&x,&y);
		if(z==1){
			if(x&1){
				x++,x>>=1;
				change1(1,1,n1,(1+n1)>>1);
			}
			else{
				x>>=1;
				change2(1,1,n2,(1+n2)>>1);
			}
		}
		else{
			if((x+y)&1)printf("0\n");
			else if(x&1){
				x>>=1,y>>=1;
				printf("%d\n",query2(1,1,n2,(1+n2)>>1,0));
			}
			else{
				x++,x>>=1,y++,y>>=1;
				printf("%d\n",query1(1,1,n1,(1+n1)>>1,0));
			}
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...