@@ -120,41 +120,42 @@ using namespace std;
120
120
121
121
#define ll long long
122
122
123
- const ll INF = (ll)300000 * 1000000000 ;
124
-
125
- int main () {
126
- int n, k;
127
- cin >> n >> k;
128
-
129
- int a[ n + 1] ;
130
- for (int i = 1; i <= n; i++) { cin >> a [i ]; }
131
-
132
- auto solve_lambda = [&](ll lmb) {
133
- pair < ll , ll > dp [n + 1 ][2 ];
134
-
135
- dp [0 ][0 ] = {0 , 0 };
136
- dp [0 ][1 ] = {-INF , 0 };
137
-
138
- for (int i = 1 ; i <= n ; i ++ ) {
139
- dp[i ][0 ] = max(dp[i - 1 ][0 ], dp[i - 1 ][1 ]);
140
-
141
- dp[i ][1 ] =
142
- max(make_pair(dp[i - 1 ][0 ].first + a[i ] - lmb,
143
- dp[i - 1 ][0 ].second + 1),
144
- make_pair(dp[i - 1 ][1 ].first + a[i ], dp[i - 1 ][1 ].second));
145
- }
146
-
147
- return max(dp[n ][0 ], dp[n ][1 ]);
148
- };
149
-
150
- ll lo = 0;
151
- ll hi = INF;
152
- while (lo < hi) {
153
- ll mid = (lo + hi) / 2;
154
- solve_lambda(mid).second <= k ? hi = mid : lo = mid + 1 ;
155
- }
156
-
157
- cout << solve_lambda (lo ).first + lo * k << endl ;
123
+ int main (){
124
+ int n, k;
125
+ cin >> n >> k;
126
+
127
+ int a[ n] ;
128
+ for (int &i : a) cin >> i;
129
+
130
+ /*
131
+ * Returns { maximum sum , subarrays used (max if ties )}
132
+ * if creating a subarray penalizes the sum by "lmb" and
133
+ * there is no limit on the number of subarrays you can create
134
+ * /
135
+ auto solveLambda = [ &] (ll lmb){
136
+ pair < ll , ll > dp [n ][2 ];
137
+
138
+ dp [0 ][0 ] = {0 , 0 };
139
+ dp [0 ][1 ] = {a[0 ] - lmb, 1};
140
+
141
+ for (int i = 1; i < n; i++){
142
+ dp[i ][0 ] = max(dp[i - 1 ][0 ], dp[i - 1 ][1 ]);
143
+
144
+ dp[i ][1 ] = max(
145
+ make_pair(dp[i - 1 ][0 ].first + a[i ] - lmb, dp[i - 1 ][0 ].second + 1),
146
+ make_pair(dp[i - 1 ][1 ].first + a[i ], dp[i - 1 ][1 ].second)
147
+ );
148
+ }
149
+ return max(dp[n - 1 ][0 ], dp[n - 1 ][1 ]);
150
+ };
151
+
152
+ ll lo = 0, hi = 1e18;
153
+
154
+ while (lo < hi){
155
+ ll mid = (lo + hi) / 2;
156
+ solveLambda(mid).second <= k ? hi = mid : lo = mid + 1 ;
157
+ }
158
+ cout << solveLambda (lo ).first + lo * k << endl ;
158
159
}
159
160
```
160
161
0 commit comments