Submission #1297029

#TimeUsernameProblemLanguageResultExecution timeMemory
1297029m_a_dPeru (RMI20_peru)C++20
18 / 100
188 ms327680 KiB
#include <bits/stdc++.h>
#include "peru.h"

using namespace std;

const long long MOD = 1e9+7;

int mod_expo(long long a, long long e) {
    if (e == 0) return 1;
    if (e == 1) return a % MOD;
    long long val = mod_expo(a/2, e);
    long long extra = (a % 2 == 1 ? a : 1);
    return (((val * val) % MOD) * extra) % MOD;
}

int32_t solve(int32_t n, int32_t k, int32_t* arr) {

    // long long everywhere it matters
    vector<long long> exponents(n);
    exponents[0] = 1;
    for(int i = 1; i < n; i++)
        exponents[i] = (exponents[i-1] * 23) % MOD;

    // dp uses long long, and initial value must be LLONG_MAX
    vector<vector<long long>> dp(n, vector<long long>(k, LLONG_MAX));

    dp[0][0] = arr[0];
    for(int j = 1; j < k; j++)
        dp[0][j] = max(dp[0][j-1], (long long)arr[j]);

    for(int i = 1; i < n; i++) {
        long long st_val = LLONG_MAX;

        for(int j = 0; j < k; j++) {
            if(i - 1 - j < 0) break;
            st_val = min(st_val, dp[i-1-j][j]);
        }

        long long add = arr[i];

        for(int j = 0; j < k; j++) {
            if(i + j >= n) break;
            add = max(add, (long long)arr[i+j]);
            dp[i][j] = st_val + add;   // no mod here!!
        }
    }

    vector<long long> ans(n, LLONG_MAX);

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < k; j++) {
            if(i - j < 0) break;
            ans[i] = min(ans[i], dp[i-j][j]);
        }
    }

    long long mod_ans = 0;
    for(int i = 0; i < n; i++) {
        mod_ans = (mod_ans + (ans[i] % MOD) * exponents[n - i - 1]) % MOD;
    }

    return mod_ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...