求助线段树
  • 板块P2574 XOR的艺术
  • 楼主expnoi
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/5/16 11:47
  • 上次更新2023/10/28 01:19:22
查看原帖
求助线段树
378346
expnoi楼主2022/5/16 11:47
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,r,sum;
}C[1000010];
int n,m,a[200010],op,l,r,lazy[1000010];
inline void pushup(int id)
{
	C[id].sum=C[id<<1].sum+C[id<<1|1].sum;
}
inline void pushdown(int id)
{
	if(lazy[id])
	{
		lazy[id<<1]^=1;
		lazy[id<<1|1]^=1;
		int len=C[id].l+C[id].r;
		C[id<<1].sum=(len-(len>>1))-C[id<<1].sum;
		C[id<<1|1].sum=(len>>1)-C[id<<1|1].sum;
		lazy[id]=0;
	}
}
inline void build(int id,int l,int r)
{
	C[id].l=l;
	C[id].r=r;
	if(l==r)
	{
		C[id].sum=a[l];
		return;
	}
	int mid=l+r>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	pushup(id);
}
inline void update(int id,int l,int r)
{
	if(l<=C[id].l&&C[id].r<=r)
	{
		C[id].sum=(C[id].r-C[id].l+1)-C[id].sum;
		lazy[id]^=1;
		return;
	}
	pushdown(id);
	int mid=C[id].l+C[id].r>>1;
	if(l<=mid)
	{
		update(id<<1,l,r);
	}
	if(r>mid)
	{
		update(id<<1|1,l,r);
	}
	pushup(id);
}
inline int query(int id,int l,int r)
{
	if(l<=C[id].l&&C[id].r<=r)
	{
		return C[id].sum;
	}
	pushdown(id);
	int mid=C[id].l+C[id].r>>1,sum=0;
	if(l<=mid)
	{
		sum+=query(id<<1,l,r);
	}
	if(r>mid)
	{
		sum+=query(id<<1|1,l,r);
	}
	return sum;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%1d",&a[i]);
	}
	build(1,1,n);
	while(m--)
	{
		cin>>op>>l>>r;
		if(op&1)
		{
			cout<<query(1,l,r)<<"\n";
		}
		else
		{
			update(1,l,r);
		}
	}
}
2022/5/16 11:47
加载中...