Submission #761341

#TimeUsernameProblemLanguageResultExecution timeMemory
761341ksu2009enPeru (RMI20_peru)C++17
0 / 100
1 ms468 KiB
#pragma GCC optimize("O3") #pragma GCC target("avx,avx2") #include "peru.h" #include <iostream> #include <vector> #include <string> #include <math.h> #include <cmath> #include <iomanip> #include <cstdio> #include <algorithm> #include <numeric> #include <map> #include <set> #include <queue> #include <stack> #include <deque> #include <bitset> #include <cstring> #include <unordered_map> using namespace std; typedef int64_t ll; ll const mod = (ll)(1e9 + 7); struct one{ ll res, min_dp, mx, mod; }; one t[4 * 2500000 + 7]; void build(ll v, ll l, ll r){ if(l == r){ t[v].res = t[v].min_dp = t[v].mx = 1e9; t[v].mod = -1; return; } ll mid = (l + r) >> 1; build(2 * v, l, mid); build(2 * v + 1, mid + 1, r); t[v].res = t[v].min_dp = t[v].mx = 1e9; t[v].mod = -1; } void push(ll v, ll l, ll r){ if(l != r && t[v].mod != -1){ //cout << " pushing " << l << ' ' << r << ' ' << t[v].mod << endl; t[2 * v].mod = max(t[2 * v].mod, t[v].mod); t[2 * v].res = t[2 * v].min_dp + t[2 * v].mod; //cout << " left son val :::::::: " << l << ' ' << r << ' ' << t[2 * v].res << endl; t[2 * v + 1].mod = max(t[2 * v + 1].mod, t[v].mod); t[2 * v + 1].res = t[2 * v + 1].min_dp + t[2 * v + 1].mod; t[v].mod = -1; } } void update_dp(ll v, ll l, ll r, ll pos, ll val, ll mx){ if(l == r){ t[v].min_dp = val; t[v].res = val + mx; t[v].mod = mx; //cout << " update_dp " << l << ' ' << r << ' ' << t[v].res << ' ' << t[v].min_dp << endl; return; } ll mid = (l + r) >> 1; push(v, l, r); if(pos <= mid) update_dp(2 * v, l, mid, pos, val, mx); else update_dp(2 * v + 1, mid + 1, r, pos, val, mx); t[v].res = min(t[2 * v].res, t[2 * v + 1].res); //cout << l << ' ' << mid << ' ' << t[2 * v].res << endl; //cout << " update_dp " << l << ' ' << r << ' ' << t[v].res << ' ' << pos << ' ' << val << ' ' << mx << endl; t[v].min_dp = min(t[2 * v].min_dp, t[2 * v + 1].min_dp); } void update_mx(ll v, ll l, ll r, ll ql, ll qr, ll mx){ if(r < ql || qr < l) return; if(ql <= l && r <= qr){ t[v].mod = max(t[v].mod, mx); t[v].res = t[v].min_dp + t[v].mod; // cout << l << ' ' << r << ' ' << t[v].mod << endl; return; } ll mid = (l + r) >> 1; push(v, l, r); update_mx(2 * v, l, mid, ql, qr, mx); update_mx(2 * v + 1, mid + 1, r, ql, qr, mx); t[v].res = min(t[2 * v].res, t[2 * v + 1].res); t[v].min_dp = min(t[2 * v].min_dp, t[2 * v + 1].min_dp); } ll get_min(ll v, ll l, ll r, ll ql, ll qr){ if(r < ql || qr < l) return 1e9; if(ql <= l && r <= qr){ // cout << "geting getting getting getiing getting " << l << ' ' << r << ' ' << t[v].res << endl; return t[v].res; } ll mid = (l + r) >> 1; push(v, l, r); return min(get_min(2 * v, l, mid, ql, qr), get_min(2 * v + 1, mid + 1, r, ql, qr)); } int solve(int n, int k, int* b){ vector<ll>dp(n + 1), a(n + 1); for(int i = 0; i < n; i++) a[i + 1] = b[i]; build(1, 1, n); dp[1] = a[1]; update_dp(1, 1, n, 1, 0, a[1]); for(int i = 2; i <= n; i++){ dp[i] = (dp[i - 1] + (ll)a[i]); update_dp(1, 1, n, i, dp[i - 1], a[i]); ll mx = 0; ll last = 1; for(int j = i - 1; j >= max(0, i - k + 1); j--){ mx = max(mx, (ll)a[j]); if(mx > a[i]){ last = j + 1; break; } } // cout << "LAST " << last << endl; if(last <= i - 1) update_mx(1, 1, n, last, i - 1, a[i]); // cout << get_min(1, 1, n, i - k + 1, i) << endl; dp[i] = get_min(1, 1, n, i - k + 1, i); dp[i - 1] %= mod; } ll p = 1; ll ans = 0; for(int i = n; i >= 1; i--){ dp[i] %= mod; ans = (ans + (p * dp[i]) % mod) % mod; p = (p * 23) % mod; } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...