#2AC其余wa,看过所有讨论区但是没有帮助,求调
查看原帖
#2AC其余wa,看过所有讨论区但是没有帮助,求调
1097100
taoyize楼主2024/8/14 17:16
#include<bits/stdc++.h>
using namespace std;
const int mx=1e6+10;
int n,m;
struct node{
	int l,r;
	long long sum;
	bool lazy=false;
}tree[mx];
void BuildSegmentTree(int i,int l,int r){
	tree[i].l=l;
	tree[i].r=r;
	if(l==r){
		tree[i].sum=0;
		return;
	}
	int mid=(tree[i].l+tree[i].r)>>1;
	BuildSegmentTree(i<<1,l,mid);
	BuildSegmentTree(i<<1|1,mid+1,r);
	tree[i].sum=0;
}
void PushDown(int i,int l,int r){
	int mid=(l+r)>>1;
	//cout << "pushDown" << endl;
	if(tree[i].lazy){
		tree[i<<1].lazy=!tree[i<<1].lazy;
		tree[i<<1|1].lazy=!tree[i<<1+1].lazy;
		tree[i<<1].sum=(mid-l+1-tree[i<<1].sum);
		tree[i<<1|1].sum=r-mid-tree[i<<1|1].sum;
		tree[i].lazy=false;
	}
}
void Change(int i,int x,int y){
	if(tree[i].l>=x&&tree[i].r<=y){
		tree[i].sum=tree[i].r-tree[i].l+1-tree[i].sum;
		tree[i].lazy=!tree[i].lazy;
		return;
	}
	PushDown(i,tree[i].l,tree[i].r);
	int mid=(tree[i].l+tree[i].r)>>1;
	if(x<=mid) Change(i<<1,x,y);
	if(y>mid) Change(i<<1|1,x,y);
	tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}
int QueryIntervals(int i,int x,int y){
	if(x<=tree[i].l&&y>=tree[i].r) return tree[i].sum;
	if(x>tree[i].r||y<tree[i].l) return 0;
	PushDown(i,tree[i].l,tree[i].r);
	int ans=0;
	int mid=(tree[i].l+tree[i].r)>>1;
	if(mid>=x) ans+=QueryIntervals(i<<1,x,y);

	if(y>mid) ans+=QueryIntervals(i<<1|1,x,y);
	return ans;
}
int main(){
	cin>>n>>m;
	BuildSegmentTree(1,1,n);
	int c,a,b;
	while(m--){
		cin>>c>>a>>b;
		if(c==0) Change(1,a,b);
		else cout<<QueryIntervals(1,a,b)<<endl;
	}
	return 0;
}

2024/8/14 17:16
加载中...