Submission #1217951

#TimeUsernameProblemLanguageResultExecution timeMemory
1217951RecursiveCoPeru (RMI20_peru)C++20
0 / 100
240 ms29764 KiB
#include "peru.h"
#include "queue"
#include "set"
using namespace std;

int mod = 1e9 + 7;

long long binpow(int base, int exp) {
    if (exp == 0) return 1;
    long long half = binpow(base, exp / 2);
    long long almost = half * half % mod;
    if (exp % 2) almost = almost * base % mod;
    return almost;
}

int solve(int n, int k, int* v){
    deque<int> q;
    int sum = 0;
    long long power = 1;
    for (int i = 0; i < n - 1; ++i) power = power * 23 % mod;
    vector<long long> dp(n);
    multiset<long long> ms;
    int inv = binpow(23, mod - 2);
    for (int i = 0; i < n; ++i) {
        while (!q.empty()) {
            int f = q.front();
            if (v[f] <= v[i]) {
                ms.extract((f? dp[f - 1]: 0) + v[f]);
                q.pop_front();
            } else {
                break;
            }   
        }
        if (!q.empty() && q.back() == i - k) {
            int b = q.back();
            ms.extract((b? dp[b - 1]: 0) + v[b]);
            q.pop_back();
        }
        ms.insert((i? dp[i - 1]: 0) + v[i]);
        dp[i] = min(*ms.begin(), (i? q.empty()? i < k? 0: dp[i - k]: dp[i - 1]: 0) + v[i]);
        q.push_front(i);
        long long here = dp[i] * power % mod;
        int cast_here = here;
        sum = (sum + cast_here) % mod;
        power = power * inv % mod;
    }
    return sum;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...