只过了一半,线段树求调
查看原帖
只过了一半,线段树求调
1179106
LLX666楼主2024/9/5 20:26

代码如下 :

#include<bits/stdc++.h> #define int long long using namespace std; const int N=5e5+5; int n,q; string s;
int tree[4N],revse[4N];

void up(int i,int l,int r) { int mid=(l+r)>>1; tree[i]=(tree[i<<1] && tree[i<<1|1] && s[mid]!=s[mid+1]); }

void build(int l,int r,int i) { if(l==r) { tree[i]=1; return ; } int mid= (l+r)>>1; build(l,mid,i<<1); build(mid+1,r,i<<1|1); up(i,l,r); }

void lazy(int i,int l,int r) { revse[i]^=1; if(l!=r) { s[l]= ( s[l]=='0' ? '1' : '0' ); s[r]= ( s[r]=='0' ? '1' : '0' ); } else { s[l]= ( s[l]=='0' ? '1' : '0' ); } }

void down(int i,int l,int r) { if(revse[i]) { int mid=(l+r)>>1; lazy(i<<1,l,mid); lazy(i<<1|1,mid+1,r); revse[i]=0; } }

int query(int jobl,int jobr,int i,int l,int r) {

if(l>=jobl && r<=jobr)
{
	return tree[i];
}
int mid=(l+r)>>1;
down(i,l,r);
int lef=-1,rig=-1;
if(jobl<=mid)
{
	lef=query(jobl,jobr,i<<1,l,mid);
}
if(jobr>=mid+1)
{
	rig=query(jobl,jobr,i<<1|1,mid+1,r);
}
if(lef==-1 && rig!=-1)
{
	return rig;		
}
else if(lef!=-1 && rig==-1)
{
	return lef;
}
else
{
	if(lef==1 && rig==1 && s[mid]!=s[mid+1])
	return 1;
	else		
	return 0;
}

}

void update(int jobl,int jobr,int l,int r,int i) { if(l>=jobl && r<=jobr) { lazy(i,l,r); return ; } int mid=(l+r)>>1; down(i,l,r); if(jobl<=mid) { update(jobl,jobr,l,mid,i<<1); } if(jobr>=mid+1) { update(jobl,jobr,mid+1,r,i<<1|1); } up(i,l,r); }

signed main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>q>>s; s='#'+s; build(1,n,1); for(int i=1;i<=q;i++) { int op; cin>>op; if(op==1) { int l,r; cin>>l>>r; update(l,r,1,n,1); } if(op==2) { int l,r; cin>>l>>r; if(query(l,r,1,1,n)) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } } return 0; }

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
int n,q;   string s;  
int  tree[4*N],revse[4*N];

void up(int i,int l,int r)
{	
	int mid=(l+r)>>1;
	tree[i]=(tree[i<<1] && tree[i<<1|1] && s[mid]!=s[mid+1]);
}


void build(int l,int r,int i)
{
	if(l==r)
	{
		tree[i]=1;
		return ;
	}
	int mid= (l+r)>>1;
	build(l,mid,i<<1);
	build(mid+1,r,i<<1|1);
	up(i,l,r);
}


void lazy(int i,int l,int r)
{
	revse[i]^=1;	
	if(l!=r)
	{
		s[l]= (  s[l]=='0' ? '1' : '0'  );
		s[r]= (  s[r]=='0' ? '1' : '0'  );
	}
	else
	{
		s[l]= (  s[l]=='0' ? '1' : '0'  );
	}
}

void down(int i,int l,int r)
{
	if(revse[i])
	{
		int mid=(l+r)>>1;
		lazy(i<<1,l,mid);
		lazy(i<<1|1,mid+1,r);
		revse[i]=0;
	}
}

int query(int jobl,int jobr,int i,int l,int r)
{	
	
	if(l>=jobl && r<=jobr)
	{
		return tree[i];
	}
	int mid=(l+r)>>1;
	down(i,l,r);
	int lef=-1,rig=-1;
	if(jobl<=mid)
	{
		lef=query(jobl,jobr,i<<1,l,mid);
	}
	if(jobr>=mid+1)
	{
		rig=query(jobl,jobr,i<<1|1,mid+1,r);
	}
	if(lef==-1 && rig!=-1)
	{
		return rig;		
	}
	else if(lef!=-1 && rig==-1)
	{
		return lef;
	}
	else
	{
		if(lef==1 && rig==1 && s[mid]!=s[mid+1])
		return 1;
		else		
		return 0;
	}
}

void update(int jobl,int jobr,int l,int r,int i)
{	 
	if(l>=jobl && r<=jobr)
	{
		lazy(i,l,r);
		return ;
	}
	int mid=(l+r)>>1;
	down(i,l,r);
	if(jobl<=mid)
	{
		update(jobl,jobr,l,mid,i<<1);
	}
	if(jobr>=mid+1)
	{
		update(jobl,jobr,mid+1,r,i<<1|1);
	}
	up(i,l,r);
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>q>>s;
	s='#'+s;
	build(1,n,1);
	for(int i=1;i<=q;i++)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int l,r; cin>>l>>r;
			update(l,r,1,n,1);
		}
		if(op==2)
		{
			int l,r;  cin>>l>>r;
			if(query(l,r,1,1,n))
			{
				cout<<"Yes"<<endl;
			}
			else
		 	{
		 		cout<<"No"<<endl;	
			}
		}
	}
	return 0;
}





2024/9/5 20:26
加载中...