TLE->WA,救救孩子
查看原帖
TLE->WA,救救孩子
49315
芜湖起飞楼主2020/6/8 22:03
#include<bits/stdc++.h>
using namespace std;
#define ls (p<<1)
#define rs (p<<1|1)
#define inf 200005

int n,m,nl,nr;
string str;
int a[inf],tree[inf<<2],tag[inf<<2];

inline void build(int p,int l,int r)
{
	if(l==r){tree[p]=a[l];return;}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	tree[p]=tree[ls]+tree[rs];
}

inline void push_down(int p,int len)
{
	if(tag[p])
	{
		tag[p]=0;
		tag[ls]^=1;
		tag[rs]^=1;
		tree[ls]=(len-len>>1)-tree[ls];
		tree[rs]=(len>>1)-tree[rs];
	}
}

inline void change(int p,int l,int r)
{
	if(l>=nl && r<=nr)
	{
		tag[p]^=1;
		tree[p]=r-l+1-tree[p];
		return;  
	}
	push_down(p,r-l+1);
	/*
	if(l==r){tree[p]^=1;return;}
	第一次这么写TLE但是答案妹错 
	加了上面那个if之后WA了orz
	谢谢好心人帮忙改代码qwq 
	*/
	int mid=(l+r)>>1;
	if(nl<=mid)change(ls,l,mid);
	if(nr>mid) change(rs,mid+1,r);
	tree[p]=tree[ls]+tree[rs];
}

inline int ans(int p,int l,int r)
{
	if(l>=nl && r<=nr)return tree[p];
	push_down(p,r-l+1);
	int mid=(l+r)>>1,sum=0;
	if(nl<=mid)sum+=ans(ls,l,mid);
	if(nr>mid) sum+=ans(rs,mid+1,r);
	return sum;
}

signed main()
{
	scanf("%d%d",&n,&m);
	cin>>str;
	int len=str.length();
	for(int i=0;i<len;++i)a[i+1]=str[i]-'0';
	build(1,1,n);
	for(int i=1;i<=m;++i)
	{
		int rqyy;
		scanf("%d %d %d",&rqyy,&nl,&nr);
		if(rqyy==0)change(1,1,n);
		if(rqyy==1)printf("%d\n",ans(1,1,n));
	}
	return 0;
}
2020/6/8 22:03
加载中...