CF1477B Nezzar and Binary String
2022/8/16 23:30:04
本文主要是介绍CF1477B Nezzar and Binary String,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题目链接:
洛谷
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; }
这篇关于CF1477B Nezzar and Binary String的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享