求助,在本地输出加个换行就对了,删掉就错了
  • 板块P2574 XOR的艺术
  • 楼主fyc123
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/11/14 16:09
  • 上次更新2023/11/4 00:35:44
查看原帖
求助,在本地输出加个换行就对了,删掉就错了
387428
fyc123楼主2021/11/14 16:09
#include <iostream>
using namespace std;
const int N=2e5+9;
int n,m,len,op,l,r,a[N];
string s;
struct node{
	int sum,add;
}tree[N<<1];
void pushup(int root){
	tree[root].sum=tree[root<<1].sum+tree[root<<1|1].sum;
}
void build(int root,int l,int r){
	if(l==r){
		tree[root].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(root<<1,l,mid),build(root<<1|1,mid+1,r);
	pushup(root);
}
void pushdown(int root,int len){
	if(tree[root].add){
		tree[root<<1].add^=1;
		tree[root<<1|1].add^=1;
		tree[root<<1].sum=(len-(len>>1))-tree[root<<1].sum;
		tree[root<<1|1].sum=(len>>1)-tree[root<<1|1].sum;
		tree[root].add=0;
	}
}
int sum(int root,int l,int r,int L,int R){
	if(l>=L&&r<=R){
		return tree[root].sum;
	}
	pushdown(root,r-l+1);
	int mid=(l+r)>>1,ans;
	if(L<=mid){
		ans+=sum(root<<1,l,mid,L,R);
	}
	if(mid+1<=R){
		ans+=sum(root<<1|1,mid+1,r,L,R);
	}
	return ans;
}
void solve(int root,int l,int r,int L,int R){
	pushdown(root,r-l+1);
	if(l>=L&&r<=R){
		tree[root].add^=1,tree[root].sum=r-l+1-tree[root].sum;
		return;
	}
	int mid=(l+r)>>1;
	if(L<=mid){
		solve(root<<1,l,mid,L,R);
	}
	if(mid+1<=R){
		solve(root<<1|1,mid+1,r,L,R);
	}
	pushup(root);
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m>>s;
	len=s.size();
	for (int i=1;i<=len;i++){
		a[i]=s[i-1]-'0';
	}
	build(1,1,n);
	while(m--){
		cin>>op>>l>>r;
		if(op==0){
			solve(1,1,n,l,r);
		}
		if(op==1){
			cout<<sum(1,1,n,l,r)<<endl;
		}
	}
	return 0;
}
2021/11/14 16:09
加载中...