codeforces1477B. Nezzar and Binary String

https://codeforces.com/contest/1477/problem/B

这题发现最后的字符串是固定的,且每次只能修改严格小于长度的一半

那么可以发现从后往前还原回去,每一段是还原成全是1还是全是0就是确定的,因为最多修改严格小于一半

那么就是线段树区间查询区间覆盖,还原完第一次以后还要跟初始串比较一蛤

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

const int maxl=3e5+10;

int n,m,k,tot,cnt,ans;
int a[maxl],c[maxl];
char s[maxl];
struct que
{
	int l,r;
}q[maxl];
struct node
{
	int l,r,tag,tagx,sum;
}tr[maxl*4];
bool vis[maxl];

inline void push_up(int k)
{
	tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
}

inline void build(int k,int l,int r)
{
	tr[k].l=l;tr[k].r=r;tr[k].sum=0;tr[k].tag=tr[k].tagx=0;
	if(l==r)
	{
		tr[k].sum=c[l];
		return;	
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	push_up(k);
}

inline void prework()
{
	scanf("%d%d",&n,&m);
	scanf("%s",s+1);
	for(int i=1;i<=n;i++)
		a[i]=s[i]-'0';
	scanf("%s",s+1);
	for(int i=1;i<=n;i++)
		c[i]=s[i]-'0';
	for(int i=1;i<=m;i++)
		scanf("%d%d",&q[i].l,&q[i].r);
	build(1,1,n);
}

inline void gank(int k)
{
	if(tr[k].tag)
	{
		int x=tr[k].tagx;
		tr[k<<1].sum=x*(tr[k<<1].r-tr[k<<1].l+1);
		tr[k<<1|1].sum=x*(tr[k<<1|1].r-tr[k<<1|1].l+1);
		tr[k<<1].tag=tr[k<<1|1].tag=1;
		tr[k<<1].tagx=tr[k<<1|1].tagx=x;
		tr[k].tag=0;
	}
}

inline int sum(int k,int l,int r)
{
	gank(k);
	if(tr[k].l==l && tr[k].r==r)
		return tr[k].sum;
	int ret=0;
	int mid=(tr[k].l+tr[k].r)>>1;
	if(r<=mid)
		ret=sum(k<<1,l,r);
	else if(l>mid)
		ret=sum(k<<1|1,l,r);
	else 
		ret=sum(k<<1,l,mid)+sum(k<<1|1,mid+1,r);
	push_up(k);
	return ret;
}

inline void upd(int k,int l,int r,int x)
{
	gank(k);
	if(tr[k].l==l && tr[k].r==r)
	{
		tr[k].sum=x*(tr[k].r-tr[k].l+1);
		tr[k].tag=1;tr[k].tagx=x;
		return;
	}
	int mid=(tr[k].l+tr[k].r)>>1;
	if(r<=mid)
		upd(k<<1,l,r,x);
	else if(l>mid)
		upd(k<<1|1,l,r,x);
	else 
		upd(k<<1,l,mid,x),upd(k<<1|1,mid+1,r,x);
	push_up(k);
}

inline void mainwork()
{
	ans=1;
	for(int i=m;i>=1;i--)
	{
		int x=sum(1,q[i].l,q[i].r);
		int len=q[i].r-q[i].l+1;
		if(x<(len+1)/2)
			upd(1,q[i].l,q[i].r,0);
		else if((len-x)<(len+1)/2)
			upd(1,q[i].l,q[i].r,1);
		else
		{
			ans=0;
			return;
		}
	}
	for(int i=1;i<=n;i++)
	if(sum(1,i,i)!=a[i])
		ans=0;
}

inline void print()
{
	puts(ans?"YES":"NO");
}

int main()
{
	int t=1;
	scanf("%d",&t);
	while(t--)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/113407812
今日推荐