Submission #868359

#TimeUsernameProblemLanguageResultExecution timeMemory
868359velislavgarkovSplit the sequence (APIO14_sequence)C++14
71 / 100
90 ms131072 KiB
#include <iostream> #include <vector> #include <stack> using namespace std; const long long INF=2e18; const int MAXN=1e5+10; const int MAXK=2e2+5; struct Prava { long long a; long long b; long long x; int ind; }; vector <Prava> env[MAXK]; stack <int> st; int br[MAXK]; long long a[MAXN], pref[MAXN], dp[MAXN][MAXK]; int ind[MAXN][MAXK]; bool check (long long a1, long long b1, long long a2, long long b2, long long a3, long long b3) { return (a1-a2)*(b3-b1)<=(a1-a3)*(b2-b1); } long long find_intersection(long long a1, long long b1, long long a2, long long b2) { long long da, db; da=a1-a2; db=b2-b1; if (da==0) return INF; return (db+da-1)/da; } void add(int k, long long a, long long b, int ind) { if (env[k].empty()) { env[k].push_back({a,b,-INF,ind}); return; } long long a1, b1, a2, b2, x; int i; while (env[k].size()>1) { i=env[k].size(); a1=env[k][i-2].a; b1=env[k][i-2].b; a2=env[k][i-1].a; b2=env[k][i-1].b; if (!check(a,b,a1,b1,a2,b2)) break; if (i-1==br[k]) br[k]--; env[k].pop_back(); } i=env[k].size(); a1=env[k][i-1].a; b1=env[k][i-1].b; x=find_intersection(a1,b1,a,b); env[k].push_back({a,b,x,ind}); } int main () { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, k; cin >> n >> k; for (int i=1;i<=n;i++) { cin >> a[i]; pref[i]=pref[i-1]+a[i]; } /*long long s; for (int i=1;i<=n;i++) { for (int j=min(i,k+1);j>1;j--) { dp[i][j]=-1; for (int p=i-1;p>=j-1;p--) { s=dp[p][j-1]+(pref[i]-pref[p])*pref[p]; if (s>dp[i][j]) { dp[i][j]=s; ind[i][j]=p; } } } dp[i][1]=0; ind[i][1]=-1; } dp[n][k+1]=-dp[n][k+1];*/ ind[0][1]=-1; for (int i=1;i<=n;i++) { /*if (a[i]==0) { for (int j=min(i,k+1);j>=1;j--) { if (j==i) { dp[i][j]=dp[i-1][j-1]; ind[i][j]=i-1; add(j,-pref[i],dp[i][j]+pref[i]*pref[i],i); continue; } dp[i][j]=dp[i-1][j]; ind[i][j]=ind[i-1][j]; } continue; }*/ for (int j=min(i,k+1);j>1;j--) { while (br[j-1]<env[j-1].size() && env[j-1][br[j-1]].x<=pref[i]) br[j-1]++; br[j-1]--; ind[i][j]=env[j-1][br[j-1]].ind; dp[i][j]=env[j-1][br[j-1]].a*pref[i]+env[j-1][br[j-1]].b; add(j,-pref[i],dp[i][j]+pref[i]*pref[i],i); ///cout << i << ' ' << j << ' ' << dp[i][j] << endl; } add(1,-pref[i],pref[i]*pref[i],i); ind[i][1]=-1; dp[i][0]=0; } cout << -dp[n][k+1] << endl; int i=ind[n][k+1], curk=k; while (curk>=1) { st.push(i); i=ind[i][curk]; curk--; } while (!st.empty()) { cout << st.top(); st.pop(); if (!st.empty()) cout << ' '; } cout << endl; return 0; }

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:90:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Prava>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |             while (br[j-1]<env[j-1].size() && env[j-1][br[j-1]].x<=pref[i]) br[j-1]++;
      |                    ~~~~~~~^~~~~~~~~~~~~~~~
#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...