Submission #1224226

#TimeUsernameProblemLanguageResultExecution timeMemory
1224226MuhammadSaramPeru (RMI20_peru)C++20
49 / 100
1073 ms77004 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int M = 25e5, mod = 1e9 + 7; const ll inf = 1e17; ll seg[M*2],val[M*2],dp[M]; int n; int power(int a,int b) { int ans=1; for (;b;b>>=1,a=1ll*a*a%mod) if (b&1) ans=1ll*ans*a%mod; return ans; } void modify(int l,int r,ll x,int v=0,int s=0,int e=n) { if (l>=e or r<=s) return; if (l<=s && e<=r) { val[v]+=x; return; } int mid=(s+e)/2,lc=v+1,rc=v+(mid-s)*2; modify(l,r,x,lc,s,mid); modify(l,r,x,rc,mid,e); seg[v]=min(seg[lc]+val[lc],seg[rc]+val[rc]); } int solve(int N,int k,int* a) { n=N; for (int i=0;i<2*n;i++) seg[i]=inf; int mx=0; for (int i=0;i<k;i++) mx=max(mx,a[i]),dp[i]=mx; set<pair<int,int>> se; se.insert({0,0}); for (int i=0;i<n;i++) { int prv=i+1; while (!se.empty()) { pair<int,int> p=*se.rbegin(); if (p.second>=a[i]) break; modify(p.first,prv,a[i]-p.second); prv=p.first; se.erase(p); } if (i>=k) { modify(i-k,i-k+1,inf); dp[i]=seg[0]+val[0]; } if (i!=n-1) modify(i+1,i+2,dp[i]-inf); se.insert({prv,a[i]}); se.insert({i+1,0}); } int inv=power(23,mod-2),val=1,ans=0; for (int i=0;i<n-1;i++) val=1ll*val*23%mod; for (int i=0;i<n;i++,val=1ll*val*inv%mod) ans=(ans+dp[i]%mod*val%mod)%mod; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...