0分求调
  • 板块P2574 XOR的艺术
  • 楼主LYQ310北极企鹅
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/3/8 13:29
  • 上次更新2023/10/23 22:42:42
查看原帖
0分求调
516634
LYQ310北极企鹅楼主2023/3/8 13:29
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5*2+100;
ll a[maxn];char s[maxn];
ll tree[maxn<<2];
ll tag[maxn<<2];
ll ls(ll x){ return x<<1; };
ll rs(ll x){ return x<<1|1; };
void push_up(ll p){
	tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(ll p,ll pl,ll pr){
	tag[p]=0;
	if(pl==pr){
		tree[p]=a[pl];
		return;
	}
	ll mid=(pl+pr)>>2;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
void addtag(ll p,ll pl,ll pr){
	tag[p]^=1;
	tree[p]=pr-pl+1-tree[p];
}
void push_down(ll p,ll pl,ll pr){
	if(tag[p]){
		ll mid=(pl+pr)>>1;
		addtag(ls(p),pl,mid);
		addtag(rs(p),mid+1,pr);
		tag[p]=0;
	}
}
void update(ll L,ll R,ll p,ll pl,ll pr){
	if(L<=pl&&pr<=R){
		addtag(p,pl,pr);
		return;
	}
	push_down(p,pl,pr);
	ll mid=(pl+pr)>>1;
	if(L<=mid) update(L,R,ls(p),pl,mid);
	if(R>mid) update(L,R,rs(p),mid+1,pr);
	push_up(p);
}
ll query(ll L,ll R,ll p,ll pl,ll pr){
	if(pl>=L&&pr<=R) return tree[p];
	push_down(p,pl,pr);
	ll res=0;
	ll mid=(pl+pr)>>1;
	if(L<=mid) res+=query(L,R,ls(p),pl,mid);
	if(R>mid)  res+=query(L,R,rs(p),mid+1,pr);
	return res;
}
int main()
{
	ll n,m;cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		a[i]=s[i]-'0';
	}
	while(m--){
		ll  q,L,R;
		cin>>q>>L>>R;
		if(q==0) update(L,R,1,1,n);
		else cout<<query(L,R,1,1,n)<<endl;
	}
	return 0;
 } 
2023/3/8 13:29
加载中...