Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <set>
- #include <map>
- #include <stack>
- #include <queue>
- #include <deque>
- #include <unordered_map>
- #include <iomanip>
- #include <regex>
- #include <numeric>
- using namespace std;
- #define pii pair<long long , long long>
- #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
- const long long dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
- const long long MAX = 100005;
- const long long MOD = 1000000009;
- long long n, k;
- long long arr[MAX];
- long long dp[MAX];
- int main() {
- //freopen("hayfeast.in", "r", stdin);
- //freopen("hayfeast.out", "w", stdout);
- FAST;
- cin >> n >> k;
- long long total = 0;
- for(long long i = 1; i <= n; i++){
- cin >> arr[i];
- total += arr[i];
- }
- deque<long long> dq;
- dq.push_back(0);
- for(long long i = 1; i <= n + 1; i++){
- // find minimum of subarray i - k ~ i - 1;
- if(i <= k + 1){
- dp[i] = dp[dq.front()] + arr[i];
- while(!dq.empty() and dp[dq.back()] >= dp[i]){
- dq.pop_back();
- }
- dq.push_back(i);
- }
- else{
- while(!dq.empty() and dq.front() < i - (k + 1)){
- dq.pop_front();
- }
- dp[i] = dp[dq.front()] + arr[i];
- while(!dq.empty() and dp[dq.back()] >= dp[i]){
- dq.pop_back();
- }
- dq.push_back(i);
- }
- }
- cout << total - dp[n + 1] << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement