Skip to content

Commit 1dead4a

Browse files
authored
Update Lagrange.mdx
1 parent 7caca48 commit 1dead4a

File tree

1 file changed

+36
-35
lines changed

1 file changed

+36
-35
lines changed

content/6_Advanced/Lagrange.mdx

+36-35
Original file line numberDiff line numberDiff line change
@@ -120,41 +120,42 @@ using namespace std;
120120

121121
#define ll long long
122122

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;
158159
}
159160
```
160161

0 commit comments

Comments
 (0)