제출 #949476

#제출 시각아이디문제언어결과실행 시간메모리
949476PM1수열 (APIO14_sequence)C++17
0 / 100
22 ms83284 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int mxn=1e5+5,mxk=205; int n,k,aa[mxn]; int par[mxn][mxk]; ll dp[mxn][2],pre[mxn],ans; deque<int>cht; bool comp(int x,int y,ll w,bool z){ ll xx=(-pre[x])*w+dp[x][z],yy=(-pre[y])*w+dp[y][z]; //cout<<x<<" "<<y<<" "<<xx<<" "<<yy<<" "<<'\n'; return xx>yy; } bool cmp(int x,int y){ return x>y; } int main(){ cin>>n>>k; for(int i=1;i<=n;i++){ cin>>aa[i]; pre[i]=pre[i-1]+aa[i]; } for(int i=1;i<=n;i++){ dp[i][1]=pre[i]*(pre[n]-pre[i]); } for(int j=2;j<=k;j++){ bool y=j&1; cht.push_back(j-1); for(int i=j;i<n;i++){ //ax+b ll x=pre[n]-pre[i]; while(cht.size()>1 && !comp(cht[0],cht[1],x,y^1))cht.pop_front(); ll a=-pre[cht[0]],b=dp[cht[0]][y^1]; dp[i][y]=a*x+b+pre[i]*x; par[i][j]=cht[0]; while(cht.size() && !cmp(cht.back(),i))cht.pop_back(); cht.push_back(i); }//cout<<'\n'; cht.clear(); } for(int i=1;i<n;i++){ int y=k&1; if(dp[i][y]>=dp[ans][y])ans=i; } cout<<dp[ans][k&1]<<'\n'; vector<int>v; while(ans!=0){ v.push_back(ans); ans=par[ans][k]; k--; } reverse(v.begin(),v.end()); for(auto i:v){ cout<<i<<" "; } return 0; }
#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...