为什么?这是为什么?
查看原帖
为什么?这是为什么?
722094
Little_Cancel_Sunny楼主2024/7/8 19:52

这样对了

#include<bits/stdc++.h>
using namespace std;

const int N=2*1e6;
int lazy[4*N];
int value[4*N];
int n,m;
char a[N];
int v[N];

void push_up(int k)
{
	value[k]=value[2*k]+value[2*k+1];
}

void push_down(int k,int size)
{
	if(lazy[k])
	{
		lazy[k*2]=lazy[2*k]^1;
		lazy[k*2+1]=lazy[k*2+1]^1;
		
		value[k*2]=( size-( size >>1 ) )-value[k*2];
		value[k*2+1]=( ( size )>>1 ) -value[k*2+1];
		
		lazy[k]^=1;
	}
}
//build 可能有问题 
inline void build(int k,int l,int r)
{
	if(l==r)
	{
		value[k]=v[l];
		return;
	}
	int mid;
	mid=(l+r)>>1;
	build(2*k,l,mid);
	build(2*k+1,mid+1,r);
	push_up(k);
}

void update(int k,int l,int r,int ln,int rn)
{	
	push_down(k,r-l+1);
	if(l>=ln && r<=rn)
	{
		lazy[k]=lazy[k]^1;
		value[k]=r-l+1-value[k];
		return ;
	}
	
	int mid;
	mid=(l+r)>>1;
	if(ln<=mid)
	{
		update(2*k,l,mid,ln,rn);
	}
	if(rn>mid)
	{
		update(2*k+1,mid+1,r,ln,rn);	
	} 
	push_up(k);
}

long long question(int k,int l,int r,int ln,int rn)
{
	if(l>=ln &&r<=rn)
	{
		return value[k];
	}
	push_down(k,r-l+1);
	int mid=(l+r)>>1;
	long long ans=0;
	if(ln<=mid)
	{
		ans+=question(2*k,l,mid,ln,rn);
	}
	if(rn>mid)
	{
		ans+=question(2*k+1,mid+1,r,ln,rn);
	}
	return ans;
}

int main()
{
	cin>>n>>m;

	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		v[i]=a[i]-'0';
		cout<<v[i]<<" ";
	}
	cout<<endl;
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int q,l,r;
		cin>>q>>l>>r;
		if(q==0)
		{
			update(1,1,n,l,r);
		}
		if(q==1)
		{
			cout<<question(1,1,n,l,r)<<endl;
		}
	}
	return 0;
}

但是这样就错了

#include<bits/stdc++.h>
using namespace std;

const int N=2*1e6;
int lazy[4*N];
int value[4*N];
int n,m;
char a[N];
int v[N];
string b;

void push_up(int k)
{
	value[k]=value[2*k]+value[2*k+1];
}

void push_down(int k,int size)
{
	if(lazy[k])
	{
		lazy[k*2]=lazy[2*k]^1;
		lazy[k*2+1]=lazy[k*2+1]^1;
		
		value[k*2]=( size-( size >>1 ) )-value[k*2];
		value[k*2+1]=( ( size )>>1 ) -value[k*2+1];
		
		lazy[k]^=1;
	}
}
//build 可能有问题 
inline void build(int k,int l,int r)
{
	if(l==r)
	{
		value[k]=v[l];
		return;
	}
	int mid;
	mid=(l+r)>>1;
	build(2*k,l,mid);
	build(2*k+1,mid+1,r);
	push_up(k);
}

void update(int k,int l,int r,int ln,int rn)
{	
	push_down(k,r-l+1);
	if(l>=ln && r<=rn)
	{
		lazy[k]=lazy[k]^1;
		value[k]=r-l+1-value[k];
		return ;
	}
	
	int mid;
	mid=(l+r)>>1;
	if(ln<=mid)
	{
		update(2*k,l,mid,ln,rn);
	}
	if(rn>mid)
	{
		update(2*k+1,mid+1,r,ln,rn);	
	} 
	push_up(k);
}

long long question(int k,int l,int r,int ln,int rn)
{
	if(l>=ln &&r<=rn)
	{
		return value[k];
	}
	push_down(k,r-l+1);
	int mid=(l+r)>>1;
	long long ans=0;
	if(ln<=mid)
	{
		ans+=question(2*k,l,mid,ln,rn);
	}
	if(rn>mid)
	{
		ans+=question(2*k+1,mid+1,r,ln,rn);
	}
	return ans;
}

int main()
{
	cin>>n>>m;

//	for(int i=1;i<=n;i++)
//	{
//		cin>>a[i];
//		v[i]=a[i]-'0';
//		cout<<v[i]<<" ";
//	}
//	cout<<endl;
	cin>>b;
	for(int i=0;i<b.size();i++)
	{
		v[i]=b[i]-'0';
		cout<<v[i]<<" ";
	}
	cout<<endl;
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int q,l,r;
		cin>>q>>l>>r;
		if(q==0)
		{
			update(1,1,n,l,r);
		}
		if(q==1)
		{
			cout<<question(1,1,n,l,r)<<endl;
		}
	}
	return 0;
}

注意:中间字符转数组的方式不一样,但是转换后的数组是一样的,而且第1份代码过了(中间输出了转换后的数组注释掉才能过)

2024/7/8 19:52
加载中...