求解线段树,change还是tagdown似乎出了问题,样例都过不去
查看原帖
求解线段树,change还是tagdown似乎出了问题,样例都过不去
678087
fangzichang楼主2022/5/16 09:29
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct Node{
	int l,r,len;
	long long sum;
	bool lazy;
}a[N*4];
int n,m,ans;
char s[N]; 
void bulid(int x,int l,int r){
	a[x].l=l;
	a[x].r=r;
	a[x].len=r-l+1;
	if(l==r){
		a[x].sum=(int)(s[l]-'0');
		return;
	}
	int mid=(l+r)/2;
	bulid(x*2,l,mid);
	bulid(x*2+1,mid+1,r);
	a[x].sum=a[x*2].sum+a[x*2+1].sum;	
}
void tagdown(int x,int len){
	if(a[x].lazy){
		a[x*2].lazy^=1;
		a[x*2+1].lazy^=1;
		a[x*2].sum=(len-(len/2))-a[x*2].sum;
		a[x*2+1].sum=(len/2)-a[x*2+1].sum;
		a[x].lazy=0;
	}
}
long long ask(int x,int l,int r){

	if(l<=a[x].l&&a[x].r<=r){
		return a[x].sum;
	}
	tagdown(x,a[x].len);
	int mid=(a[x].l+a[x].r)>>1;
	long long t=0;
	if(l<=mid){
		t+=ask(x*2,l,r);
	}
	if(r>mid){
		t+=ask(x*2+1,l,r);
	}
	return t;
}

void change(int x,int l,int r){
	tagdown(x,r-l+1);
	if(l<=a[x].l&&a[x].r<=r){
		a[x].sum=a[x].len-a[x].sum;
		a[x].lazy^=1;
		return;
	}
	tagdown(x,r-l+1);
	int mid=(a[x].l+a[x].r)>>1;
	if(l<=mid){
		change(x*2,l,r);
	}
	if(mid<r){
		change(x*2+1,l,r);
	}
	a[x].sum=a[x*2].sum+a[x*2+1].sum;
}
int main(){
	cin>>n>>m;
	scanf("%s",s+1);

	bulid(1,1,n);	
	int op,x,y,z;
	while(m--){
		scanf("%d%d%d",&op,&x,&y);
		if(op==0){
			change(1,x,y);
		}
		else{
			printf("%lld\n",ask(1,x,y));
		}

	}	
	return 0;
}

rt,一些之前经常犯的错误都查过一边了

2022/5/16 09:29
加载中...