fork download
  1. #include <bits/stdc++.h>
  2.  
  3. #define FI(i,a,b) for(int i=(a);i<=(b);i++)
  4. #define FD(i,a,b) for(int i=(a);i>=(b);i--)
  5.  
  6. #define LL long long
  7.  
  8. using namespace std;
  9.  
  10. #define N 10105
  11. #define INF (1<<30)
  12.  
  13. int t,n,m,w;
  14.  
  15. int s[N],ps[N];
  16. int dp[2][N],dp2[2][N];
  17.  
  18. int q[N],l,r;
  19.  
  20. void solve(){
  21. scanf("%d %d %d",&n,&m,&w);
  22. FI(i,1,n) scanf("%d",&s[i]);
  23. FI(i,n+1,n+w) s[i]=0;
  24. n+=w; //account for those on the right boundary
  25. FI(i,1,n) ps[i]=ps[i-1]+s[i];
  26.  
  27. //dp, rolling array
  28. memset(dp,0,sizeof(dp));
  29. memset(dp2,0,sizeof(dp2));
  30. FI(i,1,n) dp[0][i]=-INF;
  31. while(m--){
  32. l=0;
  33. r=1;
  34. q[0]=0;
  35. FI(i,1,n){
  36. int lt=max(i-w,0);
  37. //case 1: no overlap with previous hits
  38. dp[1][i]=dp2[0][lt]+ps[i]-ps[lt];
  39.  
  40. while(l<r && i-q[l]>=w) l++; //pop front
  41.  
  42. //case 2: overlap with previous hits
  43. if(l<r) dp[1][i]=max(dp[1][i],dp[0][q[l]]+ps[i]-ps[q[l]]);
  44.  
  45. while(l<r && (dp[0][i]-ps[i]) > (dp[0][q[r-1]]-ps[q[r-1]])) r--; //pop back
  46. q[r++]=i; //add current
  47.  
  48. dp2[1][i]=max(dp2[1][i-1],dp[1][i]); //update dp2
  49. }
  50. FI(i,1,n) dp[0][i]=dp[1][i],dp2[0][i]=dp2[1][i]; //rolling array
  51. }
  52. printf("%d\n",dp2[0][n]);
  53. return;
  54. }
  55.  
  56. int main(){
  57. scanf("%d",&t);
  58. while(t--) solve();
  59. return 0;
  60. }
  61.  
Success #stdin #stdout 0s 3692KB
stdin
2
9 2 3
2 8 5 1 9 6 9 3 2
9 3 3
2 8 -5 3 5 8 4 8 -6
stdout
39
38