Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker, "/stack:200000000")
- #pragma GCC optimize("Ofast")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #include <bits/stdc++.h>
- #define MOD 1000000007
- using namespace std;
- typedef unsigned long long ll;
- typedef pair< int , int > PII;
- int n, m;
- struct SegTree{
- struct Node{
- ll mn;
- };
- vector < Node > T;
- void Init(int node, int st, int dr, ll a[]){
- if (st == dr){
- T[node].mn = a[st];
- }else{
- int mid = (st + dr) >> 1;
- Init(node << 1, st, mid, a);
- Init(node << 1 | 1, mid + 1, dr, a);
- T[node].mn = Pull(T[node << 1 | 1], T[node << 1]);
- }
- }
- ll Pull(Node A, Node B){
- return min(A.mn, B.mn);
- }
- SegTree(ll a[], int n) : T(4 * n + 200) {
- Init(1, 1, n, a);
- }
- ll Query(int node, int st, int dr, int le, int ri){
- if (st > ri || dr < le){
- return LLONG_MAX;
- }
- if (st >= le && dr <= ri){
- return T[node].mn;
- }
- int mid = (st + dr) >> 1;
- ll A = Query(node << 1, st, mid, le, ri);
- ll B = Query(node << 1 | 1, mid + 1, dr, le, ri);
- return min(A, B);
- }
- };
- ll dp[100100], sum[100100], a[100100];
- int main(){
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- cin >> n >> m;
- for (int i = 1; i <= n; i++){
- cin >> a[i];
- sum[i] = a[i] + sum[i - 1];
- dp[i] = LLONG_MAX;
- }
- SegTree tree(a, n);
- for (int i = 1; i <= n; i++){
- dp[i] = dp[i - 1] + a[i];
- if (i >= m) dp[i] = min(dp[i], dp[i - m] + sum[i] - sum[i - m] + tree.Query(1, 1, n, i - m + 1, i));
- }
- cout << dp[n];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement