E12 单调队列 最大连续和

E12 单调队列 最大连续和_哔哩哔哩_bilibili

 

U162981 最大连续和 - 洛谷

f[i]表示选第 i 个数,且长度不超过m的最大连续和
f[i] = max(s[i]-s[j]) = s[i]-min(s[j]),  i-m<=j<=i-1,s为前缀和

// 单调队列 O(n)
#include<iostream>
using namespace std;

const int N=300010;
int n,m,s[N];
int q[N],f[N];

int main(){
  scanf("%d%d",&n,&m);
  for(int i=1; i<=n; i++) 
    scanf("%d",&s[i]),s[i]+=s[i-1];
  
  for(int i=1,h=1,t=0; i<=n; i++){
    while(h<=t && q[h]<i-m) h++;
    while(h<=t && s[q[t]]>=s[i-1]) t--;
    q[++t]=i-1;
    f[i]=s[i]-s[q[h]];
  }

  int res=-2e9;
  for(int i=1; i<=n; i++) res=max(res,f[i]);
  printf("%d\n",res);
}

 

P1714 切蛋糕 - 洛谷

P2629 好消息,坏消息 - 洛谷

 

posted @ 2023-04-10 09:56  董晓  阅读(967)  评论(2)    收藏  举报