E12 单调队列 最大连续和

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

 

U162981 最大连续和 - 洛谷

$f_i$ 表示选第 $i$ 个数,且长度不超过 $m$ 的最大连续和
$$ f_i = max(s_i-s_j) = s_i-min(s_j), i-m\leq j \leq i-1,s为前缀和 $$
单调队列维护区间 $[i-m, i-1]$ 内的最小值

// 单调队列 O(n)
#include<bits/stdc++.h>
using namespace std;

const int N=300010;
int n,m,s[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];
  
  deque<int> q;
  for(int i=1; i<=n; i++){
    while(q.size() && q.front()<i-m) q.pop_front();
    while(q.size() && s[q.back()]>=s[i-1]) q.pop_back();
    q.push_back(i-1);
    f[i]=s[i]-s[q.front()];
  }

  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  董晓  阅读(1157)  评论(2)    收藏  举报