社区讨论

How?Why?

P2574XOR的艺术参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhj10jx1
此快照首次捕获于
2025/11/03 18:57
4 个月前
此快照最后确认于
2025/11/03 18:57
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define N 100007

using namespace std;

struct node{
	int l;
	int r;
	int sum;
	int add_tag;
}tree[4*N];
int n,m;
int a[N];

void push_up(int k){
	tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
}

void build(int k,int l,int r){
	tree[k].l=l;
	tree[k].r=r;
	if(l==r){
		tree[k].sum = a[l];
		return ;
	}
	int mid = (tree[k].l+tree[k].r)/2;
	build(2*k,l,mid);
	build(2*k+1,mid+1,r);
	push_up(k);
}

void change(int k,int v){
	//修改本层属性
	if(v%2==1){
		tree[k].sum = (tree[k].r-tree[k].l+1)-tree[k].sum;
		//更新标记
		tree[k].add_tag += 1;
	}
	
}

void push_down(int k){
	change(k*2,tree[k].add_tag);
	change(k*2+1,tree[k].add_tag);
	tree[k].add_tag = 0;
}

void update(int k,int x,int y){
	if(tree[k].l>=x&&tree[k].r<=y){
		change(k,1);
		return;
	}
	push_down(k);
	int mid = (tree[k].l+tree[k].r)/2;
	if(x<=mid){
		update(2*k,x,y);
	}
	if(y>mid){
		update(2*k+1,x,y);
	}
	push_up(k);
}

int find(int k,int x,int y){
	if(tree[k].l>=x&&tree[k].r<=y){
		return tree[k].sum;
	}
	push_down(k);
	int res=0;
	int mid = (tree[k].l+tree[k].r)/2;
	if(x<=mid) res=find(2*k,x,y);
	if(y>mid) res+=find(2*k+1,x,y);
	return res;
}

signed main(){
//	freopen("P2574_1.in","r",stdin);
//	freopen("P2574_1.ans","w",stdout);
	cin >> n >> m;
	getchar();
	for(int i=1;i<=n;++i){
		a[i]=getchar()-'0';
	}
	getchar();
//		for(int i=1;i<=n;++i){
//		cout << a[i] << ' ';
//	}
	build(1,1,n);
	while(m--){
		int op,x,y; 
		cin >> op >> x >> y;
		if(op==0){
			update(1,x,y);
		}else{
			cout << find(1,x,y) << '\n';
		}
	}
}
我下了第一个点,一点问题没有。他说Wrong Answer.wrong answer On line 1 column 1, read 1, expected 0.

回复

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

正在加载回复...