线段树萌新求助样例都过不了。。。
查看原帖
线段树萌新求助样例都过不了。。。
549617
华悦泽楼主2022/1/22 09:10
#include<bits/stdc++.h>
#define ll long long 
#define lid (id<<1)
#define rid (id<<1|1)
using namespace std;
const int maxn=100005;
ll n,m,a[maxn];
struct seg_tree{
	int l,r;
	ll lazy,sum;
}tr[maxn*4];
void pushup(int id){
	tr[id].sum=tr[id<<1].sum+tr[id<<1|1].sum;
}
void build(int id,int l,int r){
	tr[id].l=l;
	tr[id].r=r;
	if(l==r){
		tr[id].sum=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(lid,l,mid);
	build(rid,mid+1,r);
	pushup(id);
}
void pushdown(long long id,int len){
	if(tr[id].lazy&&tr[id].l!=tr[id].r){
		tr[lid].lazy^=1;
		tr[rid].lazy^=1;
		tr[lid].sum=(len-(len>>1))-tr[lid].sum;
		tr[rid].sum=(len>>1)-tr[rid].sum;
		tr[id].lazy=0;
	}
}
void add(int id,int l,int r,long long val){
	pushdown(id,r-l+1);
	if(l<=tr[id].l&&tr[id].r<=r){
		tr[id].lazy^=1;
		tr[id].sum=r-l+1-tr[id].sum;
		return;
	}
	int mid=(tr[id].l+tr[id].r)/2;
	if(mid+1<=r)add(rid,l,r,val);
	if(l<=mid)add(lid,l,r,val);
	pushup(id);
}
long long query(long long id,long long l,long long r){
	pushdown(id,r-l+1);
	if(l<=tr[id].l&&tr[id].r<=r) return tr[id].sum;
	int mid=(tr[id].l+tr[id].r)/2;
	long long ans=0;
	if(l<=mid) ans+=query(id*2,l,r);
	if(r>mid) ans+=query(id*2+1,l,r);
	return ans;
}
int main(){
	cin>>n>>m;
	string s;
	cin>>s;
	for(int i=0;i<s.length();i++){
		a[i]=s[i]-'0';
	}
	build(1,1,n);
	while(m--){
		int op,x,y;
		ll k;
		scanf("%d",&op);
		if(op==0){
			scanf("%d%d",&x,&y);
			add(1,x,y,1);
		}
		else{
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(1,x,y));
		}
	}

	return 0;
}

2022/1/22 09:10
加载中...