Submission #908587

#TimeUsernameProblemLanguageResultExecution timeMemory
908587sofija6Split the sequence (APIO14_sequence)C++14
100 / 100
1084 ms84316 KiB
#include <bits/stdc++.h> #define ll long long #define MAXN 100002 #define MAXK 202 using namespace std; ll dp[MAXN][2],pref[MAXN]; int prevv[MAXN][MAXK]; struct line { long double k,m; long double Calc(ll x) { return k*x+m; } long double Intersect(line l) { return (m-l.m)/(l.k-k); } }; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll n,k,a; cin >> n >> k; for (int i=1;i<=n;i++) { cin >> a; pref[i]=pref[i-1]+a; } deque<pair<line,ll> > d; for (int i=1;i<n;i++) dp[i][0]=pref[i]*(pref[n]-pref[i]); for (int j=2;j<=k;j++) { d.clear(); d.push_front({{-pref[j-1],dp[j-1][0]},j-1}); for (int i=j;i<n;i++) { while (d.size()>1) { ll sz=d.size(); if (d[sz-1].first.Calc(pref[n]-pref[i])<=d[sz-2].first.Calc(pref[n]-pref[i])) d.pop_back(); else break; } dp[i][1]=d.back().first.Calc(pref[n]-pref[i])+pref[i]*(pref[n]-pref[i]); prevv[i][j]=d.back().second; if (pref[i]!=pref[i-1]) { line cur={-pref[i],dp[i][0]}; while (d.size()>1 && cur.Intersect(d[0].first)>=d[0].first.Intersect(d[1].first)) d.pop_front(); d.push_front({cur,i}); } } d.clear(); for (int i=1;i<n;i++) dp[i][0]=dp[i][1]; } ll maxx=LLONG_MIN,pos=0; for (int i=k;i<n;i++) { if (dp[i][0]>=maxx) { maxx=dp[i][0]; pos=i; } } cout << maxx << "\n"; for (int i=k;i>0;i--) { cout << pos << " "; pos=prevv[pos][i]; } return 0; } /** 7 3 4 1 3 4 0 2 3 **/

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:36:24: warning: narrowing conversion of '- pref[(j - 1)]' from 'long long int' to 'long double' [-Wnarrowing]
   36 |         d.push_front({{-pref[j-1],dp[j-1][0]},j-1});
      |                        ^~~~~~~~~~
sequence.cpp:36:44: warning: narrowing conversion of 'dp[(j - 1)][0]' from 'long long int' to 'long double' [-Wnarrowing]
   36 |         d.push_front({{-pref[j-1],dp[j-1][0]},j-1});
      |                                   ~~~~~~~~~^
sequence.cpp:51:27: warning: narrowing conversion of '- pref[i]' from 'long long int' to 'long double' [-Wnarrowing]
   51 |                 line cur={-pref[i],dp[i][0]};
      |                           ^~~~~~~~
sequence.cpp:51:43: warning: narrowing conversion of 'dp[i][0]' from 'long long int' to 'long double' [-Wnarrowing]
   51 |                 line cur={-pref[i],dp[i][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...