Submission #1222393

#TimeUsernameProblemLanguageResultExecution timeMemory
1222393__moin__Peru (RMI20_peru)C++20
0 / 100
40 ms49736 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(); while (last_max_idx != mon_s.size() && mon_s[last_max_idx] <= i-k) last_max_idx++; mon_s.push_back(i); pair<ll, int> curmin = {1e18, -1}; curmin = min(curmin, {get(i-k).first + v[mon_s[last_max_idx]], max(i-k, -1)}); 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...