样例过了,自己下载数据也过了,结果全WA求助
查看原帖
样例过了,自己下载数据也过了,结果全WA求助
696711
pengrongxuan楼主2023/10/28 17:00
//P2574
#include<bits/stdc++.h>
#define MAXN 200005
#define ls (u<<1)
#define rs (u<<1|1)
using namespace std;
struct node
{
	int l,r,sum,add;
};
node tr[MAXN<<2];
char c;
int op,n,m,x,y,a[MAXN],b[MAXN];
inline int read()
{
	int f=1,k=0;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
		  f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		k=(k<<1)+(k<<3)+(c^48);
		c=getchar();
	}
	return f*k;
}
void pushup(int u)
{
	tr[u].sum=tr[ls].sum+tr[rs].sum;
}
void pushdown(int u)
{
	if(tr[u].add)
	{
		tr[ls].add^=1;
		tr[rs].add^=1;
		tr[ls].sum=(tr[ls].r-tr[ls].l+1)-tr[ls].sum;
		tr[rs].sum=(tr[rs].r-tr[rs].l+1)-tr[rs].sum;
		tr[u].add=0;
	}
}
void build(int u,int l,int r)
{
	tr[u].l=l;
	tr[u].r=r;
	tr[u].sum=a[l];
	tr[u].add=0;
	if(l==r)
	{
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(u);
	return ;
}
void update(int u,int x,int y)
{
	if(x<=tr[u].l&&tr[u].r<=y)
	{
		tr[u].add^=1;
		tr[u].sum=(tr[u].r-tr[u].l+1)-tr[u].sum;
		return ;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(x<=mid)
	{
		update(ls,x,y);
	}
	if(y>mid)
	{
		update(rs,x,y);
	}
	pushup(u);
}
int query(int u,int x,int y)
{
	if(x<=tr[u].l&&tr[u].r<=y)
	{
		return tr[u].sum;
	}
	pushdown(u);
	int sum=0,mid=(tr[u].l+tr[u].r)>>1;
	if(x<=mid)
	{
		sum+=query(ls,x,y);
	}
	if(y>mid)
	{
		sum+=query(rs,x,y);
	}
	return sum;
}
void debug(int u)
{
	if(tr[u].l==tr[u].r)
	{
		b[tr[u].l]=tr[u].sum;
		return ;
	}
	int mid=(tr[u].l+tr[u].r)>>1;
	debug(ls);
	debug(rs);
}
int main()
{
//	freopen("P2574.in","r",stdin);
//	freopen("P2574.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		c=getchar();
		a[i]=c-48;
		b[i]=a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		op=read(),x=read(),y=read();
		if(op==0)
		{
			update(1,x,y);
			//debug(1);
		}
		else
		{
			printf("%d\n",query(1,x,y));
		}
	}
	return 0;
}

备注:

下载样例1输入:

10 5
1001010110
1 2 3
0 6 9
1 7 10
1 2 5
1 2 7

输出:

0
1
1
2

2023/10/28 17:00
加载中...