社区讨论
没过样例全 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 条回复,欢迎继续交流。
正在加载回复...