Submission #1222411

#TimeUsernameProblemLanguageResultExecution timeMemory
1222411__moin__Peru (RMI20_peru)C++20
18 / 100
1098 ms49748 KiB
#include <bits/stdc++.h>
using namespace std;

#include "peru.h"

#define ll long long

const ll p = 1e9+7;

int solve(int n, int k, int* v){
    vector<pair<ll, int>> dp(n);  // min effort, last idx of prev segment
    function<pair<ll, int>(int)> get = [&](int idx) {
        if (idx < 0) return make_pair(0ll, -1);
        return dp[idx];
    };
    vector<int> mon_s;
    for (int i = 0; i < n; i++) {
        while (!mon_s.empty() && v[mon_s.back()] <= v[i]) mon_s.pop_back();
        mon_s.push_back(i);

        pair<ll, int> curmin = {1e18, 0};
        int runmax = v[i];
        for (int j = i-1; j >= i-k; j--) {
            curmin = min(curmin, {(ll)get(j).first + (ll)runmax, j});
            if (j < 0) break;
            runmax = max(runmax, v[j]);
        }
        dp[i] = curmin;
    }
    ll factor = 1;
    ll res = 0;
    for (int i = n-1; i >= 0; i--) {
        res += ((dp[i].first%p)*factor) % p;
        res %= p;
        factor *= 23;
        factor %= p;
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...