This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Esti <3
//\
šťastia pre nás :)
// you're already the best
// _
// ^ ^ //
// >(O_O)<___//
// \ __ __ \
// \\ \\ \\\\
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize("O3","unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#pragma GCC optimize("O3")
#pragma GCC target("popcnt")
using ll = long long;
#define int long long
#define forn(i,n) for(int i=0; i<(n); ++i)
#define pb push_back
#define pi pair<int,int>
#define f first
#define s second
#define vii(a,n) vector<int> a(n); forn(i,n) cin>>a[i];
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll inf = 1e18;
const ll mod = 1e9+7;//998244853;
// \
\
:smiling_face_with_3_hearts: :smiling_face_with_3_hearts: :smiling_face_with_3_hearts:
//vidime sa veľmi skoro, moje slnko
const int N=25e5+5;
int dp[N];
int t[2*N];
int lazy[2*N];
void updup(int v) {
v>>=1;
while(v) {
t[v]=min(t[v<<1],t[(v<<1)|1])+lazy[v];
v>>=1;
}
}
void updv(int v, int x) {
t[v]+=x;
lazy[v]+=x;
}
void push(int v) {
for (int i=22; i; --i) {
int u = v>>i;
if ((u) && lazy[u]) {
updv(u<<1,lazy[u]);
updv((u<<1)|1,lazy[u]);
lazy[u]=0;
}
}
}
void Set(int i) {
i+=N;
t[i]=dp[i-N];
updup(i);
}
void upd(int l, int r, int x) {
l+=N, r+=N;
int lq=l, rq=r;
while (l<r) {
if (l&1) {
updv(l++,x);
}
if (r&1) {
updv(--r,x);
}
l>>=1, r>>=1;
}
updup(lq);
updup(rq-1);
}
int query(int l, int r) {
l+=N, r+=N;
push(l);
push(r-1);
int ans = inf;
while (l<r) {
if (l&1) {
ans=min(ans,t[l++]);
}
if (r&1) {
ans=min(ans,t[--r]);
}
l>>=1;
r>>=1;
}
return ans;
}
int32_t solve(int32_t n, int32_t k, int32_t* a) {
if (n==1) return a[0]%mod;
forn(i,n+1) dp[i]=inf;
forn(i,2*N) t[i]=inf;
dp[0]=0;
Set(0);
vector<pi> st={ {0,inf} };
for (int i=1; i<=n; ++i) {
while (st.back().s <= a[i-1]) {
int r = st.back().f;
int x = st.back().s;
st.pop_back();
int l = st.back().f;
upd(l,r,-x);
}
int l = st.back().f;
int r = i;
upd(l,r,a[i-1]);
st.pb({r,a[i-1]});
int x = query(max(i-k,0ll),i);
dp[i] = x;
Set(i);
}
int ans=0, p=1;
for (int i=n; i; --i) {
dp[i]%=mod;
ans=(ans+p*dp[i])%mod;
p=(p*23)%mod;
}
return ans;
}
Compilation message (stderr)
peru.cpp:3:1: warning: multi-line comment [-Wcomment]
3 | //\
| ^
peru.cpp:9:1: warning: multi-line comment [-Wcomment]
9 | // \ __ __ \
| ^
peru.cpp:36:1: warning: multi-line comment [-Wcomment]
36 | // \
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |