Submission #1217959

#TimeUsernameProblemLanguageResultExecution timeMemory
1217959KindaGoodGamesPeru (RMI20_peru)C++20
0 / 100
1018 ms134472 KiB
#include "peru.h"
#include<bits/stdc++.h>
#define int long long

using namespace std;

int INF = numeric_limits<int>::max()/2;
int mod = 1e9+7;

struct SegmentTree{
    int len = 1;
    vector<int> S;

    SegmentTree(vector<int> arr){
        int n = arr.size();
        while(len < n){
            len <<= 1;
        }

        S.resize(2*len);
        for(int i = 0; i < n; i++){
            S[i+len] = arr[i];
        }
        for(int i = len-1; i > 0; i--){
            S[i] = max(S[i*2], S[i*2+1]);
        }
    }

    int query(int ql, int qr, int l = 0, int r = -2, int i = 1){
        if(r == -2) r = len;

        if(ql <= l && r <= qr) return S[i];
        if(r <= ql || qr <= l) return 0;
        
        int mid = (l+r)/2;
        return max(query(ql,qr,l,mid,i*2),query(ql,qr,mid,r,i*2+1));
    }
};

int exp(int a, int k){
    if(k == 0) return 1;
    int res = exp(a,k/2);

    if(k % 2 == 0) return (res * res) % mod;
    return ((res*res% mod) * a )% mod;
}

int32_t solve(int32_t n, int32_t k, int32_t* S){
    vector<int> v(n);
    for(int i = 0; i < n; i++){
        v[i] = S[i];
    }
    vector<int> dp(n+1, INF);

    dp[0] = 0;

    int res = 0;

    SegmentTree seg(v);

    for(int i = 1; i <= n; i++){
        int ma = 0;
        // for(int p = i; p >= max(1LL, i-k+1LL); p--){
        //     ma = max(ma, v[p-1]);
        //     dp[i] = min(dp[i], dp[p-1]+ma);
        // }
        dp[i] = dp[max(0LL, i-k)];
        int l = max(0LL, i-k); 
        ma = seg.query(l, i);
        dp[i] += ma;
        res += ((dp[i]%mod) * exp(23, n-i))%mod;
        res %= mod;
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...