Submission #954056

#TimeUsernameProblemLanguageResultExecution timeMemory
954056TAhmed33Peru (RMI20_peru)C++17
49 / 100
1058 ms54384 KiB
#include <bits/stdc++.h> #include <peru.h> using namespace std; typedef long long ll; const ll inf = 1e16; const int MAXN = 2'500'000 + 25; const int MOD = 1e9 + 7; int add (int a, int b) { a += b; if (a >= MOD) a -= MOD; return a; } int sub (int a, int b) { a -= b; if (a < 0) a += MOD; return a; } int mul (int a, int b) { return (a * 1ll * b) % MOD; } int pw[MAXN]; ll a[MAXN], n, k; deque <array <ll, 4>> cur; deque <ll> dd; ll dp[MAXN]; struct MinimumStack { stack <pair <ll, ll>> dd; ll get () { return dd.empty() ? inf : dd.top().second; } void pop() { dd.pop(); } bool empty () { return dd.empty(); } void push (ll x) { ll mn = x; if (!empty()) x = min(x, get()); dd.push({x, mn}); } int size () { return (int)dd.size(); } ll top () { return dd.empty() ? inf : dd.top().first; } void swap (MinimumStack &x) { dd.swap(x.dd); } }; struct MonotonicDeque { deque <ll> cur; void push_front (ll x) { cur.push_front(x); } void push_back (ll x) { cur.push_back(x); } void pop_front () { cur.pop_front(); } void pop_back () { cur.pop_back(); } ll get () { ll ret = 1e18; for (auto i : cur) ret = min(ret, i); return ret; } // MinimumStack left, right, temp; // void upd () { // if (right.empty() && left.empty()) return; // bool f = 0; // if (right.empty()) { // f = 1; left.swap(right); // } // int x = (int)right.size() / 2; // while (x--) { // temp.push(right.top()); // right.pop(); // } // while (!right.empty()) { // left.push(right.top()); right.pop(); // } // while (!temp.empty()) { // right.push(temp.top()); temp.pop(); // } // if (f) { // left.swap(right); // } // } // ll get () { // return min(left.get(), right.get()); // } // int size () { // return (int)left.size() + (int)right.size(); // } // bool empty() { // return size() == 0; // } // void push_back (ll x) { // right.push(x); // } // void pop_back() { // if (right.empty()) upd(); // right.pop(); // } // void push_front (ll x) { // left.push(x); // } // void pop_front() { // if (left.empty()) upd(); // left.pop(); // } // ll back () { // if (right.empty()) upd(); // return right.top(); // } // ll front () { // if (left.empty()) upd(); // return left.top(); // } } cur2; int solve (int n, int k, int *a) { pw[0] = 1; for (int i = 1; i < MAXN; i++) { pw[i] = mul(23, pw[i - 1]); } int last = 0; for (int i = 1; i <= n; i++) { array <ll, 4> v = {i, i - 1, i - 1, dp[i - 1]}; while (!cur.empty() && a[cur.back()[0] - 1] < a[i - 1]) { v[1] = cur.back()[1], v[3] = min(v[3], cur.back()[3]); cur.pop_back(); //if (last != cur.back()[0]) cur2.pop_back(); } cur.push_back(v); while (!cur.empty() && cur[0][0] <= i - k) { //if (cur.size()!=1) cur2.pop_front(); cur.pop_front(); } for (int j = last; j < cur[0][0]; j++) { while (!dd.empty() && dp[dd.back()] >= dp[j]) dd.pop_back(); dd.push_back(j); } last = cur[0][0]; while (!dd.empty() && dd.front() < i - k) dd.pop_front(); /*cout << i << ": \n"; for (auto j : cur) { for (auto l : j) cout << l << " "; cout << '\n'; } cout << '\n'; for (auto j : dd) cout << j << " "; cout << '\n' << '\n'; */ if (cur[0][0] != i) { //cout << "??\n"; //cur2.push_back(a[i - 1] + v[3]); } //cout << cur[0][0] << " " << a[cur[0][0] - 1] << " " << dd.front() << " " << dp[dd.front()] << '\n'; ll mx = a[cur[0][0] - 1] + dp[dd.front()]; //mx = min(mx, cur2.get()); for(auto j:cur)if (j[0]!=last)mx=min(mx,a[j[0]-1]+j[3]); /*cout << cur2.get() << '\n'; for (auto j : cur2.cur) cout << j << " "; cout << '\n';*/ dp[i] = mx; } // for (int i = 1; i <= n; i++) cout << dp[i] << " "; //cout << '\n'; int ret = 0; for (int i = 1; i <= n; i++) ret = add(ret, mul(dp[i] % MOD, pw[n - i])); return ret; } /* int main () { int n, k; cin >> n >> k; int a[n + 1] = {}; for (int i = 0; i < n; i++) cin >> a[i]; cout << solve(n, k, a) << '\n'; }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...