Submission #1222403

#TimeUsernameProblemLanguageResultExecution timeMemory
1222403__moin__Peru (RMI20_peru)C++20
0 / 100
1095 ms49720 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;
    // int last_max_idx = 0;
    for (int i = 0; i < n; i++) {
        while (!mon_s.empty() && v[mon_s.back()] <= v[i]) mon_s.pop_back();
        // last_max_idx = min(last_max_idx, (int)mon_s.size());
        // while (last_max_idx != mon_s.size() && mon_s[last_max_idx] <= i-k) last_max_idx++;
        mon_s.push_back(i);

        int max_val = 0;
        for (int j = max(i-k+1, 0); j <= i; j++) max_val = max(max_val, v[j]);

        pair<ll, int> curmin = {1e18, -1};
        curmin = min(curmin, {get(i-k).first + max_val, max(i-k, -1)});
        if (mon_s.size() != 1 && mon_s[mon_s.size()-2] >= i-k) curmin = min(curmin, {get(mon_s[mon_s.size()-2]).first + v[i], mon_s[mon_s.size()-2]});
        if (mon_s.size() != 1 && dp[mon_s[mon_s.size()-2]].second >= i-k) curmin = min(curmin, dp[mon_s.size()-2]);
        // 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...