Submission #1322087

#TimeUsernameProblemLanguageResultExecution timeMemory
1322087wangzhiyi33Discharging (NOI20_discharging)C++20
100 / 100
314 ms20636 KiB
#include<bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") #define int long long const int inf=1e18; struct line{ int m=inf,c; int y(int x){ return m*x+c; } }; struct seg{ int l,r; line opt; seg *lf=0,*rg=0; seg(int x,int y){ l=x,r=y; } void update(line baru){ if(opt.m==inf){ opt=baru; return; } int mid=(l+r)/2; if(opt.y(mid)>baru.y(mid))swap(opt,baru); if(l==r)return; if(baru.m>opt.m){ if(mid==l)return; if(!lf){ lf=new seg(l,mid-1); } lf->update(baru); } else{ if(mid==r)return; if(!rg){ rg=new seg(mid+1,r); } rg->update(baru); } } int query(int x){ int mid=(l+r)/2; int ans=opt.y(x); if(mid==x)return ans; if(mid>=x){ if(!lf)return ans; ans=min(ans,lf->query(x)); } else{ if(!rg)return ans; ans=min(ans,rg->query(x)); } return ans; } }; signed main(){ int n; cin>>n; int a[n+1]; for(int q=1;q<=n;q++){ cin>>a[q]; } vector<int>pos; pos.push_back(0); pos.push_back(1); for(int q=2;q<=n;q++){ if(a[q]>a[pos.back()]){ pos.push_back(q); } } pos.push_back(n+1); int hah=1e9; seg cur(1,hah); int dp[pos.size()]; cur.update({0,0}); for(int q=1;q<pos.size()-1;q++){ int brp=cur.query(a[pos[q]]); brp+=a[pos[q]]*n; dp[q]=brp; cur.update({-(pos[q+1]-1),dp[q]}); } cout<<dp[pos.size()-2]<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...