Submission #1089723

#TimeUsernameProblemLanguageResultExecution timeMemory
1089723TooruLuoiDiHocK blocks (IZhO14_blocks)C++14
100 / 100
146 ms42904 KiB
/*
Link: https://oj.uz/problem/submit/IZhO14_blocks
*/
#include <bits/stdc++.h>
#define MASK(k) (1LL << (k))
#define BIT(x, i) (((x) >> (i)) & 1)
#define __builtin_popcount __builtin_popcountll
#define __builtin_ctz __builtin_ctzll
#define For(i, a, b) for(int i = (int)(a); i <= (int)(b); ++i)
#define Fod(i, a, b) for(int i = (int)(a); i >= (int)(b); --i)
//#define int long long
#define ll long long
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL);
#define whole(a) a.begin(), a.end()
#define vi vector<int>
#define ii pair<int, int>
#define pb push_back
#define fi first
#define se second
#define gqt ""

template<class X, class Y>
bool minimize(X& x, const Y& y) {
    X eps = 1e-9;
    if (x > y + eps) {
        x = y;
        return true;
    }
    else return false;
}

template<class X, class Y>
bool maximize(X& x, const Y& y) {
    X eps = 1e-9;
    if (x + eps < y) {
        x = y;
        return true;
    }
    else return false;
}

template<class T>
T Abs(const T& x) {
    return (x < 0 ? -x : x);
}

const int INF = 1e9 + 7;
const ll oo = 1e18 + 7;
const int MAX = 1000005;
const int MOD = 1e9 + 7;

using namespace std;
int n, k, a[MAX], dp[105][100005];
void process(){
    cin >> n >> k;
    For(i, 1, n) cin >> a[i];
    memset(dp, 0x3f, sizeof(dp));
    dp[1][0] = 0;
    For(i, 1, n) dp[1][i] = max(dp[1][i - 1], a[i]);
    For(i, 2, k){
        stack<ii> st;
        For(j, i, n){
            int minF = dp[i - 1][j - 1];
            while(!st.empty() && a[st.top().se] <= a[j]){
                minimize(minF, st.top().fi);
                st.pop();
            }
            dp[i][j] = min(dp[i][st.empty() ? 0 : st.top().se], minF + a[j]);
            st.push(ii(minF, j));
        }
    }
    cout << dp[k][n];
}

signed main()
{
    fastio
    if (fopen(gqt".inp", "r")) {
        freopen(gqt".inp", "r", stdin);
        freopen(gqt".out", "w", stdout);
    }
    int Test = 1;
    while (Test--) {
        process();
    }
    return 0;
}

Compilation message (stderr)

blocks.cpp: In function 'int main()':
blocks.cpp:79:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |         freopen(gqt".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
blocks.cpp:80:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |         freopen(gqt".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...