제출 #1297128

#제출 시각아이디문제언어결과실행 시간메모리
1297128ThunnusPeru (RMI20_peru)C++20
0 / 100
313 ms49492 KiB
#include "peru.h" #include<bits/stdc++.h> using namespace std; using i64 = long long; //#define int i64 #define vi vector<int> #define vvi vector<vi> #define vb vector<bool> #define se second #define fi first #define pii pair<int, int> #define sz(x) (int)(x).size() const int MOD = 1e9 + 7; const int B = 23; const int MAXN = 25e5 + 5; i64 pw[MAXN]; inline int hashx(int n, vector<i64> &x){ int ret = 0; for(int i = 0; i < n; i++){ //cout << "i: " << i << " x: " << x[i] << "\n"; x[i] %= MOD; i64 val = (x[i] * pw[n - 1 - i]) % MOD; ret = (ret + val) % MOD; } return ret; } int solve(int n, int k, int *s){ pw[0] = 1; for(int i = 1; i <= n; i++){ pw[i] = (pw[i - 1] * B) % MOD; } vector<i64> dp(n); dp[0] = s[0]; deque<int> dq, mxidx; multiset<i64> ms; dq.emplace_back(0); ms.emplace(dp[0] + s[1]); mxidx.emplace_back(0); for(int i = 1; i < k; i++){ dp[i] = max(dp[i - 1], (i64)s[i]); while(!mxidx.empty() && s[mxidx.back()] <= s[i]){ mxidx.pop_back(); } mxidx.emplace_back(i); if(i + 1 < n){ while(!dq.empty() && s[dq.back() + 1] < s[i + 1]){ int idx = dq.back(); ms.erase(ms.find(dp[idx] + s[idx + 1])); dq.pop_back(); } dq.emplace_back(i); ms.emplace(dp[i] + s[i + 1]); } } for(int i = k; i < n; i++){ dp[i] = dp[i - 1] + s[i]; while(!dq.empty() && dq.front() < i - k){ int idx = dq.front(); ms.erase(ms.find(dp[idx] + s[idx + 1])); dq.pop_front(); } while(!mxidx.empty() && i - mxidx.front() >= k){ mxidx.pop_front(); } while(!mxidx.empty() && s[mxidx.back()] <= s[i]){ mxidx.pop_back(); } mxidx.emplace_back(i); dp[i] = min(dp[i], dp[i - k] + s[mxidx.front()]); if(!ms.empty()){ dp[i] = min(dp[i], *ms.begin()); } if(i + 1 < n){ while(!dq.empty() && s[dq.back() + 1] < s[i + 1]){ int idx = dq.back(); ms.erase(ms.find(dp[idx] + s[idx + 1])); dq.pop_back(); } dq.emplace_back(i); ms.emplace(dp[i] + s[i + 1]); } } return hashx(n, dp); } /* signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, k; cin >> n >> k; int s[n]; for(int i = 0; i < n; i++){ cin >> s[i]; } cout << solve(n, k, s) << "\n"; return 0; } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...