求条!无法通过样例!
查看原帖
求条!无法通过样例!
909957
LITFLYR楼主2024/7/30 11:59
#include<bits/stdc++.h>
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define int long long
using namespace std;
int n,m,op,x,y;
string s;
int tre[8000005],lazy[8000005];
void push_up(int f){
	tre[f]=tre[ls(f)]+tre[rs(f)];
}
void push_down(int f,int l,int r){
	lazy[ls(f)]=(lazy[f]+lazy[ls(f)])%2;
	lazy[rs(f)]=(lazy[f]+lazy[rs(f)])%2;
	int mid=(l+r)>>1;
	if (lazy[f]==1){
		tre[ls(f)]=(mid-l+1)-tre[ls(f)];
		tre[rs(f)]=(r-mid)-tre[rs(f)];
	}
	lazy[f]=0;
}
void build(int f,int l,int r){
	lazy[f]=0; 
	if(l==r){
		tre[f]=s[l]-'0';
		return ;
	}
	int mid=(l+r)>>1;
	build(ls(f),l,mid);
	build(rs(f),mid+1,r);
	push_up(f);
}
void cha(int f,int l,int r,int x,int y){
//	cout << "Tips " << f << " " << l << " " << r << endl;
 	if(x<=l&&r<=y){
		tre[f]=(r-l+1)-tre[f];
		lazy[f]=(lazy[f]+1)%2;
		return ;
	}
	push_down(f,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) cha(ls(f),l,mid,x,y);
	if(y>mid) cha(rs(f),mid+1,r,x,y);
	push_up(f);
}
int query(int f,int l,int r,int x,int y){
//	cout << "Tips " << f << " " << l << " " << r << endl;
	if(x<=l&&r<=y){
		return tre[f]; 
//		cout << "tips " << tre[f] << endl;
	}
	push_down(f,l,r);
	int ans=0,mid=(l+r)>>1;
	if(x<=mid) ans+=query(ls(f),l,mid,x,y);
//	cout << "tips " << ans << endl;
	if(y>mid) ans+=query(rs(f),mid+1,r,x,y);
	return ans;
}
signed main(){
	cin >> n >> m >> s;
	s=' '+s;
	while(m--){
		cin >> op >> x >> y;
		if(op==0) cha(1,1,n,x,y);
		if(op==1) cout << query(1,1,n,x,y) << endl;
	}
	return 0;
}
2024/7/30 11:59
加载中...