题解 CF950B 【Intercepted Message】

1|0维护两个前缀和+双指针查找即可

这道题我做的时候看的标签居然是贪心。。。也是无语了(希望管理大大改下标1.q,qq1.l_iiil_iil_jj1.ij1i-l_i=j-lj+1i-l_i<j-l_ji++i+1-l_ij-l_jj-l_j<i-l_i$的前缀和的情况同理。

大概思路就是这些了,下面给出代码实现方便理解请忽略快读和快输

#include<cstdio> #include<cctype> inline int max(int a,int b){ return a>b?a:b; } inline int read(int &x){ x=0;char ch=0;int sign=1; do{ch=getchar();if(ch=='-')sign=-1;}while(!isdigit(ch)); do{x=x*10+ch-48;ch=getchar();}while(isdigit(ch)); x*=sign; } inline void out(int x){ if(x<0){ x=-x; putchar('-'); } if(x>9){ out(x/10); } putchar(x%10+'0'); } int n,m,a1[1000010],a2[1000010],dp1[1000010],dp2[1000010]; int main(){ read(n);read(m); for(register int i=1;i<=n;i++){ read(a1[i]); if(i==1)dp1[1]=a1[1]; else dp1[i]=dp1[i-1]+a1[i]; } for(register int i=1;i<=m;i++){ read(a2[i]); if(i==1)dp2[1]=a2[1]; else dp2[i]=dp2[i-1]+a2[i]; } int i=1,j=1,li=0,lj=0,ans=0; while(i<=n&&j<=m){ if(i==li)i=li+1; if(j==lj)j=lj+1; if(dp1[i]-dp1[li]==dp2[j]-dp2[lj]){ ans++;li=i,lj=j; }else{ if(dp1[i]-dp1[li]>dp2[j]-dp2[lj]){ j++; } if(dp1[i]-dp1[li]<dp2[j]-dp2[lj]){ i++; } } } out(ans-1); return 0; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17777007.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示