Submission #535539

#TimeUsernameProblemLanguageResultExecution timeMemory
535539keta_tsimakuridzePeru (RMI20_peru)C++14
0 / 100
1 ms596 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 = 25e5 + 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<int> a(n + 1), p(n + 1); vector<ll> dp(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++) { if(st.size() && st.front().s < i - k + 1) { pii x = st.front(); s.erase(s.find(dp[x.s - 1] + a[x.f])); st.front().s++; x.s++; if(x.s> x.f) st.pop_front(); else { s.insert(dp[x.s - 1] + a[x.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}); int x = a[i] + dp[l - 1]; s.insert(x); 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...