[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 a2​a4​

因此再手推几组样例会发现

只有当奇偶性相同的时候才有答案,而答案就是 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;
				}
			}
		}
	}

}
上一篇:c函数重写


下一篇:去掉每行行首空格及行尾空格,无空行的方法