CF1779C Least Prefix Sum 题解
题目大意
给定一个序列 ,长度 。
每次操作可以把 变成 。
要求 做前缀和之后的序列 中最小值为 。
求最小操作次数。
题目解析
显然你需要保证:
- 后缀和都小于等于零(注意从 开始)
- 前缀和都大于等于零
考虑第一条,显然我们可以倒着来,如果遇到后缀和大于零的,显然是把之后那部分最大的数变成负的。
然后考虑第二条,如果此时前缀和小于等于零,就把前面最小的变成正的。
显然用个堆维护一下最值就好。第一次Div1A用堆,感觉好离谱。
时间复杂度
int n,m,a[maxn]; priority_queue<int> bi,EB; priority_queue<int,vector<int>,greater<int> > sm,ES; void work(){ n=read(); m=read(); int i,ans=0; ll sum; for(i=1;i<=n;i++) a[i]=read(); bi=EB; sm=ES; sum=0; for(i=m;i>=2;i--){ sum+=a[i]; bi.push(a[i]); while(sum>0) sum-=bi.top()*2,bi.pop(),ans++; } sum=0; for(i=m+1;i<=n;i++){ sum+=a[i]; sm.push(a[i]); while(sum<0) sum-=sm.top()*2,sm.pop(),ans++; } print(ans),pc('\n'); return; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具