ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1477B Nezzar and Binary String

2022-08-16 21:32:55  阅读:150  来源: 互联网

标签:Nezzar Binary lazy ch rs int void CF1477B ls


题目链接:
洛谷
Codeforces

Solution

我一开始以为是道结论题,一直想贪心策略,后来卡了二十多分钟,感觉不行,赶紧换方法。

这题不能正着做,只能反过来,从答案串往原串推,因为正着做有后效性,十分恶心。反过来做以后,顺序就变了,即先改后看,对于每一次检查的区间 \([l,r]\),我们这次修改,一定要改成全为 \(0\) 或 \(1\),由于我们只能改小于一半的字符,所以只能把数量小的变为数量多的,如果相同,则无法改,直接判为不能。

所以,我们现在需要解决的问题为:

  • 查询区间 \(1\) 的个数
  • 将区间全部修改为 \(0\) 或 \(1\)

对于问题 \(1\),直接区间求和即可。线段树即可完美解决。

最后,告诫大家,永远不要相信 memset 的复杂度,能不用就不用。这题要把 lazy 标记最开始打成 \(-1\),不要 memset,建树时解决就可以了,不然会 T。

Code

#include<bits/stdc++.h>
#define ls p*2
#define rs p*2+1
using namespace std;
void read(int &x)
{
	char ch=getchar();
	int r=0,w=1;
	while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
	x=r*w;
}
const int N=2e5+7;
char c[N],t[N];
int sum[N*4],lazy[N*4],size[N*4],ans;
void update(int p)
{
	size[p]=size[ls]+size[rs];
	sum[p]=sum[ls]+sum[rs];
}
void build(int p,int l,int r)
{
	lazy[p]=-1;
	if(l==r)
	{
		sum[p]=t[l]-'0';
		size[p]=1;
		return;
	}
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	update(p);
}
void pushdown(int p)
{
	lazy[ls]=lazy[p];
	sum[ls]=size[ls]*lazy[p];
	lazy[rs]=lazy[p];
	sum[rs]=size[rs]*lazy[p];
	lazy[p]=-1;
}
void change(int p,int l,int r,int x,int y,int k)
{
	if(x<=l&&r<=y)
	{
		lazy[p]=k;
		sum[p]=size[p]*k;
		return;
	}
	if(lazy[p]!=-1)pushdown(p);
	int mid=l+r>>1;
	if(x<=mid)change(ls,l,mid,x,y,k);
	if(y>mid)change(rs,mid+1,r,x,y,k);
	update(p);
}
void query(int p,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		ans+=sum[p];
		return;
	}
	if(lazy[p]!=-1)pushdown(p);
	int mid=l+r>>1;
	if(x<=mid)query(ls,l,mid,x,y);
	if(y>mid)query(rs,mid+1,r,x,y);
}
int qx[N],qy[N];
void solve()
{
	int n,q;
	read(n);read(q);
	scanf("%s",c+1);scanf("%s",t+1);
	build(1,1,n);
	for(int i=1;i<=q;i++)
		read(qx[i]),read(qy[i]);
	for(int i=q;i>=1;i--)
	{
		ans=0;
		int x=qx[i],y=qy[i];
		int len=y-x+1;
		query(1,1,n,x,y);
		if(ans==len-ans){puts("NO");return;}
		if(ans<len-ans)change(1,1,n,x,y,0);
		else change(1,1,n,x,y,1);
	}
	for(int i=1;i<=n;i++)
	{
		ans=0;
		query(1,1,n,i,i);
		if(ans!=c[i]-'0'){puts("NO");return;}
	}
	puts("YES");
}
int main()
{
	int T;
	read(T);
	while(T--)solve();
	return 0;
}

标签:Nezzar,Binary,lazy,ch,rs,int,void,CF1477B,ls
来源: https://www.cnblogs.com/LAK666/p/16593007.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有