分块求调,悬1关
查看原帖
分块求调,悬1关
564524
StormWhip楼主2024/8/16 20:44
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,M=1e3+5;
int n,q;
int len,tot,L[M],R[M],bel[N];
bool a[N],d[M],lazy[M];
bool T(int p)
{
	return a[p]!=lazy[bel[p]];
}
bool Nice(int l,int r) 
{
	if(l==r) return 1;
	bool f=1;
	for(int i=l;i<r;i++)
		if(T(i)==T(i+1))
		{
			f=0;
			break;
		}
	return f;
}
void Build()
{
	len=sqrt(n);
	tot=n/len;
	if(n%len!=0) tot++;
	for(int i=1;i<=tot;i++) L[i]=(i-1)*len+1,R[i]=i*len;
	R[tot]=n;
	for(int i=1;i<=n;i++) bel[i]=(i-1)/len+1;
	for(int i=1;i<=tot;i++) d[i]=Nice(L[i],R[i]);
}
void Update(int l,int r)
{
	int x=bel[l],y=bel[r];
	if(x==y)
	{
		for(int i=l;i<=r;i++) a[i]=!a[i];
		d[x]=Nice(L[x],R[x]);
	}
	for(int i=l;i<=R[x];i++) a[i]=!a[i];
	for(int i=L[y];i<=r;i++) a[i]=!a[i];
	for(int i=x+1;i<y;i++) lazy[i]=!lazy[i];
	d[x]=Nice(L[x],R[x]);
	d[y]=Nice(L[y],R[y]);
}
bool Query(int l,int r)
{
	int x=bel[l],y=bel[r];
	if(x==y) return Nice(l,r);
	if(T(L[x+1])==T(R[x])||T(R[y-1])==T(L[y])) return 0;
	for(int i=x+1;i<y-1;i++)
		if(d[i]==0||d[i+1]==0||T(R[i])==T(L[i+1]))
			return 0;
	if(Nice(l,R[x])&&Nice(L[y],r)) return 1;
	else return 0;
}
int main()
{	
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);	
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		char c;
		cin>>c;
		a[i]=c-'0';
	}
	Build();
	while(q--)
	{
		int index,l,r;
		cin>>index>>l>>r;
		if(index==1) Update(l,r);
		else if(Query(l,r)) cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0; 
} 

AC23个,WA19个

2024/8/16 20:44
加载中...