CF1753A Make Nonzero Sum 题解
给定一个长度为 的,仅由 , 或 组成的序列 。你需要把它划分成若干个连续段,设这些连续段分别为 z ,那么这样划分的代价是
现在你需要确定任意一种划分方式让总代价为零,或者报告无解。
题目解析
显然 和 个数为奇数的时候肯定无解。
这样只需要保证相邻的两个非零数字都可以消掉就可以了。
如果相邻的两个非零数字不一样,那么只需要这两个都是正的,显然这两个都作为一个新的区间的开头即可。
如果相邻的两个非零数字一样,那么这两个就要一正一负。如果前面的一个是正的,那么后面的一个就是负的。这样就有两种可能:如果两个相邻,那么就直接分到一组,否则就前面的作为一组的第一个、后面的作为一组的第二个。
非常丑的赛时代码
int n,a[maxn],p[maxn],cnt; struct JTZ{ int l,r; }ans[maxn]; int tmp; void work(){ n=read(); cnt=0; int i; for(i=1;i<=n;i++){ a[i]=read(); if(a[i]) p[++cnt]=i; } if(cnt&1){ puts("-1"); return; } tmp=0; if(cnt==0){ pc('1'),pc('\n'); pc('1'),pc(' '),print(n),pc('\n'); return; } if(p[1]>1) tmp++,ans[tmp].l=1,ans[tmp].r=p[1]-1; for(i=1;i<=cnt;i+=2){ if(i>1&&p[i-1]<p[i]-1){ tmp++,ans[tmp].l=p[i-1]+1,ans[tmp].r=p[i]-1; } if(a[p[i]]==a[p[i+1]]){ if(p[i]+1==p[i+1]){ tmp++; ans[tmp].l=p[i]; ans[tmp].r=p[i+1]; } else{ tmp++; ans[tmp].l=p[i]; ans[tmp].r=p[i+1]-2; tmp++; ans[tmp].l=p[i+1]-1; ans[tmp].r=p[i+1]; } } else { if(p[i]+1==p[i+1]){ tmp++; ans[tmp].l=p[i]; ans[tmp].r=p[i]; tmp++; ans[tmp].l=p[i+1]; ans[tmp].r=p[i+1]; } else { tmp++; ans[tmp].l=p[i]; ans[tmp].r=p[i+1]-1; tmp++; ans[tmp].l=p[i+1]; ans[tmp].r=p[i+1]; } } } if(p[cnt]!=n){ tmp++; ans[tmp].l=p[cnt]+1; ans[tmp].r=n; } print(tmp),pc('\n'); for(i=1;i<=tmp;i++) print(ans[i].l),pc(' '),print(ans[i].r),pc('\n'); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具