Submission #1182539

#TimeUsernameProblemLanguageResultExecution timeMemory
1182539quannnguyen2009K blocks (IZhO14_blocks)C++20
0 / 100
2 ms324 KiB
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define ii pair<int, int>
#define sz(v) (int)v.size()
#define all(v) v.begin(), v.end()
using namespace std;

const int N = 1e5+5, mod = 1e9+7, inf = 1e18;

int n, k;
int a[N];
int dp[N], tmp[N];

struct It {
    int id, d, mn;
};

signed main() {
    freopen("blocks.in", "r", stdin);
    freopen("blocks.out", "w", stdout);
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> k;
    for (int i=1; i<=n; i++) cin >> a[i];
    for (int i=1; i<=n; i++) tmp[i] = max(tmp[i-1], a[i]);
    tmp[0] = inf;
    // for (int i=1; i<=n; i++) cout << tmp[i] << " ";
    // cout << '\n';
    for (int j=2; j<=k; j++) {
        vector<It> v;
        dp[0] = inf;
        for (int i=1; i<=n; i++) {
            if(!sz(v) || a[i]<a[v.back().id]) {
                v.pb({i, tmp[i-1], (sz(v) ? min(v.back().mn, tmp[i-1]+a[i]) : tmp[i-1]+a[i])});
            } else {
                int dp_mn = inf;
                while(sz(v) && a[i]>=a[v.back().id]) {
                    dp_mn = min(dp_mn, v.back().d);
                    v.pop_back();
                }
                dp_mn = min(dp_mn, tmp[i-1]);
                // cout << tmp[i-1] << '\n';
                v.pb({i, dp_mn, (sz(v) ? min(v.back().mn, dp_mn+a[i]) : dp_mn+a[i])});
            }
            if(i>=j) dp[i] = v.back().mn;
            else dp[i] = inf;
            // for (auto [a, b, c]: v) cout << a << " " << b << " " << c << '\n';
            // cout << '\n';
        }
        for (int i=0; i<=n; i++) {
            tmp[i] = dp[i];
            // cout << dp[i] << " ";
        }
    }
    cout << tmp[n];
}

Compilation message (stderr)

blocks.cpp: In function 'int main()':
blocks.cpp:22:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   22 |     freopen("blocks.in", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
blocks.cpp:23:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |     freopen("blocks.out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...