Submission #535508

#TimeUsernameProblemLanguageResultExecution timeMemory
535508keta_tsimakuridzePeru (RMI20_peru)C++14
49 / 100
602 ms69032 KiB
#include<bits/stdc++.h> #include "peru.h" using namespace std; #define ll long long #define pii pair<int,int> #define f first #define s second #define endl "\n" const int N = 2e5 + 5, mod = 1e9 + 7; //! int t; void add(int &a, int c) { a += c; if(a >= mod) a -= mod; } int solve(int n, int k, int *x) { vector<ll> a(n + 1), dp(n + 1), p(n + 1); for(int i = 0; i < n; i++) a[i + 1] = x[i]; deque<pii> st; multiset<ll> s; p[0] = 1; for(int i = 1; i <= n - 1; i++) p[i] = (ll)p[i - 1] * 23 % mod; int ans = 0; for(int i = 1; i <= n; i++) { while(st.size() && st.front().s < i - k + 1) { s.erase(s.find(dp[st.front().s - 1] + a[st.front().f])); st.front().s++; if(st.front().s > st.front().f) st.pop_front(); else s.insert(dp[st.front().s - 1] + a[st.front().f]); } int l = i; while(st.size() && a[st.back().f] < a[i]) { l = st.back().s; s.erase(s.find(dp[l - 1] + a[st.back().f])); st.pop_back(); } st.push_back({i, l}); s.insert(a[i] + dp[l - 1]); dp[i] = *s.begin(); add(ans, (ll)dp[i] % mod * p[n - i] % mod); } return ans; }/* static int s[N]; int main() { int n, k; cin >> n >> k; for(int i = 0; i < n; i++) cin >> s[i]; cout << solve(n, k, s); }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...