This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct line{
ll a,b;
int idx;
};
int N,K;
int Prev[201][100001];
ll A[100001],DP[2][100001];
stack<int> S;
deque<line> DQ;
ll f(line l,ll x){
return l.a*x+l.b;
}
bool g(line l1,line l2,line l3){
return (l1.b-l3.b)*(l2.a-l1.a)<=(l1.b-l2.b)*(l3.a-l1.a);
}
void add_line(line l){
while ((int)DQ.size()>1&&g(DQ[(int)DQ.size()-2],DQ.back(),l))
DQ.pop_back();
if (!DQ.empty()&&DQ.back().a==l.a){
if (DQ.back().b<=l.b)
DQ.pop_back();
else
return;
}
DQ.push_back(l);
}
void query(ll x){
while ((int)DQ.size()>1&&f(DQ[0],x)<=f(DQ[1],x))
DQ.pop_front();
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>N>>K;
for (int i=1; i<=N; i++){
cin>>A[i];
A[i]+=A[i-1];
}
for (int t=1; t<=K; t++){
while (!DQ.empty())
DQ.pop_back();
for (int i=t+1; i<=N; i++){
add_line({A[i-1],DP[0][i-1]-A[i-1]*A[i-1],i-1});
query(A[i]);
DP[1][i]=f(DQ[0],A[i]);
Prev[t][i]=DQ[0].idx;
}
for (int i=t+1; i<=N; i++)
DP[0][i]=DP[1][i];
}
cout<<DP[1][N]<<"\n";
for (int t=K,i=N; t; t--){
S.push(Prev[t][i]);
i=Prev[t][i];
}
while (!S.empty()){
cout<<S.top()<<" ";
S.pop();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |