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