题目链接:
洛谷
Codeforces
我一开始以为是道结论题,一直想贪心策略,后来卡了二十多分钟,感觉不行,赶紧换方法。
这题不能正着做,只能反过来,从答案串往原串推,因为正着做有后效性,十分恶心。反过来做以后,顺序就变了,即先改后看,对于每一次检查的区间 ,我们这次修改,一定要改成全为 或 ,由于我们只能改小于一半的字符,所以只能把数量小的变为数量多的,如果相同,则无法改,直接判为不能。
所以,我们现在需要解决的问题为:
对于问题 ,直接区间求和即可。线段树即可完美解决。
最后,告诫大家,永远不要相信 memset 的复杂度,能不用就不用。这题要把 lazy 标记最开始打成 ,不要 memset,建树时解决就可以了,不然会 T。
#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;
}
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话