线段树过不了样例....
  • 板块P2574 XOR的艺术
  • 楼主_gcl
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/9/24 16:43
  • 上次更新2023/11/4 05:46:57
查看原帖
线段树过不了样例....
162133
_gcl楼主2021/9/24 16:43
#include<bits/stdc++.h>
using namespace std;
const int N=200007;

inline int read()
{
	int sum=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		sum=(sum<<1)+(sum<<3)+(c^48);
		c=getchar();
	}
	return sum*f;
} 

char c;

int w[N],n,m,x,y,z; 

struct node
{
	int l,r;
	int sum,add;
}tr[N<<2];

void pushup(int u)
{
	tr[u].sum=(tr[u<<1].sum+tr[u<<1|1].sum);
}

void pushdown(int u)
{
    node &root=tr[u],&left=tr[u<<1],&right=tr[u<<1|1];
	if(root.add)
	{
		left.add^=1;
		if(left.add)left.sum=(left.r-left.l+1)-left.sum;
		right.add^=1;
		if(right.add)right.sum=(right.r-right.l+1)-right.sum;
		root.add=0;
	}	
}

void build(int u,int l,int r)
{
	if(l==r)tr[u]={l,r,w[r],0};
	else 
	{
		tr[u]={l,r};
		int mid=tr[u].l+tr[u].r>>1;
		build(u<<1,l,mid),build(u<<1|1,mid+1,r);
		pushup(u);
	}
}

void modify(int u,int l,int r)
{		
    pushdown(u);
	if(tr[u].l>=l&&tr[u].r<=r)
	{
		tr[u].sum=r-l+1-tr[u].sum;
		tr[u].add^=1;
	}
	else
	{
        int mid=tr[u].l+tr[u].r>>1;
		if(l<=mid)modify(u<<1,l,r);
		if(r>mid)modify(u<<1|1,l,r);
		pushup(u);	
	}
}

int query(int u,int l,int r)
{
	if(tr[u].l>=l&&tr[u].r<=r)return tr[u].sum;
	int mid=tr[u].l+tr[u].r>>1,res=0;
	pushdown(u);
	
	if(l<=mid)res=query(u<<1,l,r);
	if(r>mid)res+=query(u<<1|1,l,r);
	
	return res;
}

int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		cin>>c;
		w[i]=c-'0';
	}
	build(1,1,n);
	while(m--){
		x=read(),y=read(),z=read();;
		if(x==0)modify(1,y,z);
		else cout<<query(1,y,z)<<endl; 
	}
	return 0;
}

离谱,样例都没过。。。

2021/9/24 16:43
加载中...