2022-03-12 09:12阅读: 21评论: 0推荐: 0

寒假集训专题一-J.最大连续和

J.最大连续和

原题:https://loj.ac/p/10176

题意:

在一段整数序列中找到长度不超过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 中国大陆许可协议进行许可。

posted @   TimMCBen  阅读(21)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.