样例没过+0分求助
查看原帖
样例没过+0分求助
1023793
yaodiguoan楼主2024/1/27 19:56
#include <iostream>
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9'){
		  if (ch=='-') f=-1;
		  ch=getchar();
	}
	while (ch>='0'&&ch<='9'){
		  x=x*10+ch-'0';
		  ch=getchar();
	}
	return x*f;
}
int n,m,a[200010],segment_tree[800010],lazy[800010];
int get_sum(int l,int r,int s,int t,int now){
	lazy[now]%=2;
	int son=now<<1;
	if(lazy[now]){
		segment_tree[now]=(t-s+1)-segment_tree[now];
		lazy[son]+=lazy[now],lazy[son+1]+=lazy[now];
	}
	lazy[now]=0;
	if(l<=s&&t<=r) return segment_tree[now];
	int sum=0,mid=(s+t)>>1;
	if(l<=mid) sum+=get_sum(l,r,s,mid,son);
	if(r>mid) sum+=get_sum(l,r,mid+1,t,son+1);
	return sum;
}
void update(int l,int r,int s,int t,int now){
	lazy[now]%=2;
	int son=now<<1;
	if(lazy[now]){
		segment_tree[now]=(t-s+1)-segment_tree[now];
		lazy[son]+=lazy[now],lazy[son+1]+=lazy[now];
	}
	lazy[now]=0;
	if(l<=s&&t<=r) {
		lazy[now]++;
		return;
	}
	int mid=(s+t)>>1;
	if(l<=mid) update(l,r,s,mid,son);
	if(r>mid) update(l,r,mid+1,t,son+1);
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int op,l,r;
		op=read(),l=read(),r=read();
		if(op==1) printf("%d\n",get_sum(l,r,1,n,1));
		else update(l,r,1,n,1);
	}
	return 0;
}



2024/1/27 19:56
加载中...