E12 单调队列 最大连续和
E12 单调队列 最大连续和_哔哩哔哩_bilibili
$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); }
浙公网安备 33010602011771号