寒假集训专题一-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
#include
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=a[i]&&h<=t) t--;
        q[++t]=i;
    }
    cout<

或者直接使用deque