寒假集训专题一-J.最大连续和
J.最大连续和
题意:
在一段整数序列中找到长度不超过m的总和最大的子序列
思路:
对于 50%50% 的数据,1\le n,m\le 1041≤n,m≤104;
对于 100%100% 的数据,1\le n,m\le 2\times 1051≤n,m≤2×105
根据数据范围,我们若采用暴力 时间复杂度是(n-m)*m必超
所以我们采用滑动窗口的,复杂度是m+n。
我们先对数据进行前缀和处理,然后在滑动窗口的条件下维护一个单调递增的队列,要注意使单调队列有一个初始值,在前缀和的情况下,相当于滑动窗口的长度+1.
代码
#include<iostream> #include<cstdio> using namespace std; const int maxn=2e5+7; int n,m,ans=-2147483647,a[maxn],h=0,t=0,q[maxn]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){cin>>a[i];a[i]+=a[i-1];} for(int i=1;i<=n;i++){ while(q[h]+m<i&&h<=t) h++; ans=max(ans,a[i]-a[q[h]]); while(a[q[t]]>=a[i]&&h<=t) t--; q[++t]=i; } cout<<ans<<endl; return 0; }
或者直接使用deque
本文作者:TimMCBen
本文链接:https://www.cnblogs.com/TimMCBen/p/15996233.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步