求解线段树。。。。10分,有点找不到错误
  • 板块P2574 XOR的艺术
  • 楼主Viega
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/1/29 18:28
  • 上次更新2023/10/28 10:23:22
查看原帖
求解线段树。。。。10分,有点找不到错误
572383
Viega楼主2022/1/29 18:28
#include<bits/stdc++.h>
using namespace  std;
const int MAXN=2e5 + 5;
#define ll long long
int p[8*MAXN];int sum[8*MAXN];int add[8*MAXN];
void build(int k,int l,int r){
	if(l==r){
		sum[k]=p[l];
		return ;
	}
	int mid=(l+r)/2;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	sum[k]=sum[k<<1]+sum[k<<1|1];
}
void push_down(int k,int len){
	if(add[k]==0)
	return;
	add[k<<1]^=1;
	add[k<<1|1]^=1;
	sum[k<<1]=(len-(len>>1))-sum[k<<1];
	sum[k<<1|1]=(len>>1)-sum[k<<1|1];
	add[k]==0;	
}
void change(int a,int b,int k,int l,int r){
	if(a<=l&&r<=b){
	sum[k]=r-l+1-sum[k];
	add[k]^=1;
	return;
}
int mid=(l+r)/2;
	push_down(k,r-l+1);
	if(a<=mid)change(a,b,k*2,l,mid);
	if(b>mid)change(a,b,k*2+1,mid+1,r);
    sum[k]=sum[k<<1]+sum[k<<1|1];
}
int query(int a,int b,int k,int l,int r){
	if(a<=l&&r<=b)
	return sum[k];
	int mid=(l+r)/2;
	push_down(k,r-l+1);
	int res=0;
	if(a<=mid)
	res+=query(a,b,k<<1,l,mid);
	if(b>mid)
	res+=query(a,b,k<<1|1,mid+1,r);
	return res;
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		char ch;
		cin>>ch;
		p[i]=ch-'0';
	}
	build(1,1,n);
	for(int i=0;i<m;i++){
		int j;cin>>j;
		if(j==0){
			int a,b;
			cin>>a>>b;
			change(a,b,1,1,n);
		}
		if(j==1){
		int a,b;cin>>a>>b;
		cout<<query(a,b,1,1,n)<<endl;
		}
	}
	return 0;
}
2022/1/29 18:28
加载中...