Submission #401636

#TimeUsernameProblemLanguageResultExecution timeMemory
401636PyqePeru (RMI20_peru)C++14
100 / 100
343 ms229332 KiB
#include <bits/stdc++.h> #include "peru.h" using namespace std; #define mp make_pair #define fr first #define sc second const int m=23,dv=1e9+7; const long long inf=1e18; int d,nn=0,a[2500069],sk[2500069],fh[2500069],sr[2500069]; long long dp[2500069]; vector<int> al[2500069]; deque<pair<int,long long>> dq; bitset<2500069> spc; void bd(int x) { int i,sz=al[x].size(),l; fh[x]=x; for(i=0;i<sz;i++) { l=al[x][i]; bd(l); fh[x]=max(fh[x],fh[l]); } } void dfs(int x,long long cw) { int i,sz=al[x].size(),l; dp[x]=min(cw,dp[max(x-d,0)]+a[sr[x]]); for(;!dq.empty()&&dq.front().fr<x-d;dq.pop_front()); if(!dq.empty()) { dp[x]=min(dp[x],dq.front().sc); } for(i=0;i<sz;i++) { l=al[x][i]; if(fh[l]-d>x) { for(;!dq.empty()&&dq.back().sc>=dp[x]+a[l];dq.pop_back()); dq.push_back({x,dp[x]+a[l]}); dfs(l,cw); } else { dfs(l,min(cw,dp[x]+a[l])); } } } int solve(int n,int od,int* aa) { int i,j,ml=1,z=0; d=od; for(j=0,i=1;i<=n;i++) { a[i]=aa[i-1]; for(;nn&&a[sk[nn]]<=a[i];nn--) { spc[sk[nn]]=0; } al[sk[nn]].push_back(i); nn++; sk[nn]=i; spc[i]=1; for(;j<=i-d||!spc[j];j++); sr[i]=j; } bd(0); dfs(0,inf); for(i=n;i;i--) { z=(z+dp[i]%dv*ml)%dv; ml=(long long)ml*m%dv; } return z; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...