10pts求调
查看原帖
10pts求调
1213859
tianruihan楼主2025/6/24 22:28
#include<bits/stdc++.h>  
#define fst ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);  
#define int long long  
#define endl '\n'  
using namespace std;   
const int N = 2e5+1;  
int n,m;  
struct node{  
	int l,r,sum;  
	bool lazy;  
}tr[N*4];  
void build(int u,int l,int r){  
	tr[u].l=l,tr[u].r=r;  
	tr[u].lazy=0;  
	if(l==r){  
		tr[u].sum=1;  
		return ;  
	}	  
	int mid=(l+r)/2;  
	build(u*2,l,mid);  
	build(u*2+1,mid+1,r);  
	tr[u].sum=tr[u*2].sum+tr[u*2+1].sum;  
}  
void pushdown(int u){  
	if(tr[u].lazy){  
		tr[2*u].lazy^=1;  
		tr[u*2].sum=(tr[u*2].r-tr[u*2].l+1)-tr[u*2].sum;  
		tr[2*u+1].lazy^=1;  
		tr[u*2+1].sum=(tr[u*2+1].r-tr[u*2+1].l+1)-tr[u*2+1].sum;  
		tr[u].lazy=0;  
	}  
}  
void change(int u,int l,int r){   
	int k=tr[u].r-tr[u].l+1;  
	if(l<=tr[u].l and r>=tr[u].r){  
		tr[u].sum=k-tr[u].sum;  
		tr[u].lazy^=1;  
		return ;  
	}  
	pushdown(u);  
	int mid=(tr[u].l+tr[u].r)/2;  
	if(l<=mid)	change(u*2,l,mid);  
	if(r>mid)	change(u*2+1,mid+1,r);  
	tr[u].sum=tr[u*2].sum+tr[u*2+1].sum;  
	return ;  
}  
int search(int u,int l,int r){  
	if(l<=tr[u].l and r>=tr[u].r)	return   tr[u].sum;
	pushdown(u);  
	int mid=(tr[u].l+tr[u].r)/2,ans=0;  
	if(l<=mid)	ans+=search(u*2,l,min(r,mid));  
	if(mid<r)	ans+=search(u*2+1,max(l,mid),r);  
	return ans;  
}  

signed main(){  
	fst  
	cin>>n>>m;  
	build(1,1,n);  
	while(m--){  
		int c,a,b;  
		cin>>c>>a>>b;  
		if(c==0)	change(1,a,b);  
		if(c==1)	cout<<search(1,a,b)<<endl;  
	}  
	  return 0;	    
}  
2025/6/24 22:28
加载中...