求救wa,悬关
查看原帖
求救wa,悬关
973971
xfx2011楼主2024/6/26 17:19
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
struct node{
	int l,r,num,add;
}tr[maxn << 4];
int a[maxn];
#define lc p << 1
#define rc p << 1 | 1
void up(int p){
	tr[p].num = tr[lc].num + tr[rc].num;
} 
void down(int p,int len){
	if(tr[p].add){
		tr[lc].num = (len - (len >> 1))  - tr[lc].num;
		tr[rc].num = (len >> 1) - tr[rc].num;
		tr[lc].add ^= 1;
		tr[rc].add ^= 1;
		tr[p].add = 0;
	}
}
void build(int p,int l,int r){
	tr[p] = {l,r,a[l],0};
	if(l == r)
		return ;
	int m = (l + r) >> 1;
	build(lc,l,m);
	build(rc,m + 1,r);
	up(p);
}
void update(int p,int x,int y){
	if(x <= tr[p].l && tr[p].r <= y){
		tr[p].num = (y - x + 1) - tr[p].num;
		tr[p].add ^= 1;
		return ; 
	}
	int m = (tr[p].l + tr[p].r) >> 1;
	down(p,y - x + 1);
	if(x <= m)
		update(lc,x,y);
	if(y >= m + 1)
		update(rc,x,y);
	up(p);
}
int query(int p,int l,int r){
	if(l <= tr[p].l && tr[p].r <= r)
		return tr[p].num;
	down(p,r - l + 1);
	int m = (tr[p].l + tr[p].r) >> 1;
	int ans = 0;
	if(l <= m)
		ans += query(lc,l,r);
	if(r >= m + 1)
		ans += query(rc,l,r);
	return ans;
}
int n,m;
char s[maxn];
int main(){
	cin >> n >> m;
	for(int i = 1;i <= n;i ++)
		cin >> s[i];
	for(int i = 1;i <= n;i ++)
		a[i] = s[i] - '0';
	build(1,1,n);
	for(int i = 1;i <= m;i ++){
		int op,l,r;
		cin >> op >> l >> r;
		if(op == 0)
			update(1,l,r);
		else
			cout << query(1,l,r) << endl;
	}
	return 0;
} 
2024/6/26 17:19
加载中...