/ * DP [i] [0 |. 1] represents a group selected | not selected the i-th maximum benefit obtainable cows dp [i] [0] = max (dp [i-1] [0], dp [i-1 ] [. 1]) dp [i] [1] = max (dp [x] [ 0] + SUM [I] -sum [X]) was converted to dp [i] [1] = max (dp [x] [ 0] -sum [x]) + sum [it] then dp [x] [0] -sum [x] can be used to maintain a monotonic queue * / #include <bits / STDC ++. H> #include <queue> the using namespace STD; #define LL Long Long #define N 200005 LL n-, A [N], SUM [N], m, DP [N] [ 2 ]; int main () { CIN >> >> n- m; for ( int I = . 1 ; I <= n-; I ++) Scanf ( " % LLD ",&a[i]); for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i]; deque<int>q; q.push_back(0); for(int i=1;i<=n;i++){ dp[i][0]=max(dp[i-1][0],dp[i-1][1]); if(q.size()==0){ dp[i][1]=a[i]; q.push_back(i); }else { while(q.size()){ int p=q.front(); if(i-p>m){q.pop_front();continue;} else { dp[i][1]=sum[i]+dp[p][0]-sum[p]; break; } } while(q.size()){ int p=q.back(); if(dp[p][0]-sum[p]<=dp[i][0]-sum[i]) q.pop_back(); else break; } q.push_back(i); } } cout<<max(dp[n][0],dp[n][1])<<'\n'; }