[luogu]P6225 [eJOI2019]异或橙子 树状数组
作者:互联网
前言
因为过样例但是暴0的屑
传送门 :
思路
观察题目所给的 2 − 4 2-4 2−4,不难发现利用 a x o r a = 0 a\ xor\ a=0 a xor a=0,最后只剩下了 a 2 a 4 a_2 a_4 a2a4
因此再手推几组样例会发现
只有当奇偶性相同的时候才有答案,而答案就是 l , l + 2 , . . . r l,l+2,...r l,l+2,...r
但是这里需要注意修改操作
对于异或树状数组的修改 ,我们仍然可以使用上面那个性质,
这样子我们再 m o d i f y modify modify的时候,需要 m o d i f y ( a [ x ] x o r y ) modify(a[x]\ xor\ y) modify(a[x] xor y)
最后输出异或即可
d
e
b
u
g
debug
debug好痛苦啊QAQ
Mycode
const int N = 2e5+10;
int t1[N],t2[N],a[N];
int n,m;
int lowbit(int x){
return x & (-x);
}
void add(int *C,int x,int k){
for(int i = x;i <= n ; i += lowbit(i))
C[i]^=k;
}
int query(int *C,int x){
int sum = 0;
for(int i = x; i ; i-=lowbit(i))
sum^=C[i];
return sum;
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
if(i&1)
add(t1,i,a[i]);
else
add(t2,i,a[i]);
}
for(int i=1;i<=m;i++){
int op,x,y;
cin>>op>>x>>y;
if(op == 1){
if(x%2 !=0)
{
add(t1,x,a[x]^y);
a[x] = y;
}
else{
add(t2,x,a[x]^y);
a[x] = y;
}
}else{
if(((x&1)^(y&1)))
cout<<0<<endl;
else
{
if(x%2 !=0 ){
int l = query(t1,y);
int r = query(t1,x-1);
int ans = l^r;
cout<<ans<<endl;
}else{
int l = query(t2,y);
int r = query(t2,x-1);
int ans = l^r;
cout<<ans<<endl;
}
}
}
}
}
标签:eJOI2019,P6225,int,luogu,t2,t1,add,modify,query 来源: https://blog.csdn.net/qq_34364611/article/details/123227424