Submission #1297241

#TimeUsernameProblemLanguageResultExecution timeMemory
1297241efegPeru (RMI20_peru)C++20
100 / 100
299 ms33888 KiB
#include <bits/stdc++.h>
#include "peru.h"
using namespace std; 

using i64 = long long; 

const int MOD = 1e9 + 7; 

i64 add(i64 x,i64 y){
    return (x % MOD + y % MOD) % MOD; 
}
i64 mul(i64 x,i64 y){
    return (x % MOD * (y % MOD)) % MOD; 
}


int solve(int n, int k, int* v){
    vector<i64> dp(n + 10,2e18); 
    deque<i64> dq; 
    multiset<i64> st; 

    dp[0] = v[0]; 
    dq.push_back(0); 
    for (int i = 1; i < n; i++){
        while (!dq.empty() && v[i] >= v[dq.back()]){
            int x = dq.back(); 
            dq.pop_back();  
            if (!dq.empty()) st.erase(st.find(v[x] + dp[dq.back()])); 
        }
        if (!dq.empty()) st.insert(v[i] + dp[dq.back()]); 
        dq.push_back(i);

        
        while (!dq.empty() && dq.front() <= i - k){
            int x = dq.front();
            dq.pop_front(); 
            st.erase(st.find(v[dq.front()] + dp[x])); 
        }

        //for (auto x : dq) cerr << x << ","; 
        //cerr << endl; 

        if (st.size()) dp[i] = *st.begin(); 
        if (!dq.empty()) dp[i] = min(dp[i],(i - k >= 0 ? dp[i - k] : 0) + v[dq.front()]); 
    }

    i64 pw = 1,ans = 0; 
    for (int i = n-1; i > -1; i--){
        ans = add(ans,mul(dp[i],pw));
        pw = mul(pw,23); 
    }

    /*for (int i = 0; i < n; i++){
        cerr << dp[i] << " "; 
    }*/ 


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