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;
const int N = 1e5 + 1;
const int K = 201;
int n,k;
long long s[N];
pair<long long,int> dp[N][K];
vector<long long> m[2],b[2],id[2];
bool bad(vector<long long> &m,vector<long long> &b,int l1,int l2,int l3)
{
return (double)(b[l2]-b[l3])*(m[l2]-m[l1])<(double)(b[l1]-b[l2])*(m[l3]-m[l2]);
}
void add(vector<long long> &m,vector<long long> &b,vector<long long> &id,long long mx,long long bx,long long idx)
{
if(!m.empty() and m.back()==mx and b.back()==bx) return;
m.push_back(mx),b.push_back(bx),id.push_back(idx);
while(m.size()>2 and bad(m,b,m.size()-3,m.size()-2,m.size()-1))
m.erase(m.end()-2),b.erase(b.end()-2),id.erase(id.end()-2);
}
int ptr[K];
pair<long long,int> query(int &ptr,vector<long long> &m,vector<long long> &b,vector<long long> &id,long long x)
{
if(m.empty()) return {0,0};
if(ptr>=m.size()) ptr = m.size()-1;
while(ptr<m.size()-1 and m[ptr+1]*x+b[ptr+1]>=m[ptr]*x+b[ptr]) ptr++;
return {m[ptr]*x+b[ptr],id[ptr]};
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n >> k;
for(int i = 1;i <= n;i++) cin >> s[i],s[i]+=s[i-1];
int now = 1,prev = 0;
for(int j = 0;j <= k;j++)
{
m[now].clear(),b[now].clear(),id[now].clear();
for(int i = 1;i <= n;i++)
{
if(j) dp[i][j] = query(ptr[j],m[prev],b[prev],id[prev],s[i]);
if(!(j>1 and !dp[i][j].second) and j<i) add(m[now],b[now],id[now],s[i],dp[i][j].first-s[i]*s[i],i);
}
swap(now,prev);
}
cout << dp[n][k].first << '\n';
vector<int> ans;
int l = k;
for(int x = dp[n][k].second;x;x = dp[x][--l].second) ans.push_back(x);
reverse(ans.begin(),ans.end());
for(int x : ans) cout << x << ' ';
}
Compilation message (stderr)
sequence.cpp: In function 'std::pair<long long int, int> query(int&, std::vector<long long int>&, std::vector<long long int>&, std::vector<long long int>&, long long int)':
sequence.cpp:30:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(ptr>=m.size()) ptr = m.size()-1;
~~~^~~~~~~~~~
sequence.cpp:31:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(ptr<m.size()-1 and m[ptr+1]*x+b[ptr+1]>=m[ptr]*x+b[ptr]) ptr++;
~~~^~~~~~~~~~~
# | 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... |