Submission #74721

#TimeUsernameProblemLanguageResultExecution timeMemory
74721goodbatonSplit the sequence (APIO14_sequence)C++14
78 / 100
635 ms83596 KiB
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <iostream> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <functional> #include <cassert> typedef long long ll; using namespace std; #define debug(x) cerr << #x << " = " << x << endl; #define mod 1000000007 //1e9+7(prime number) #define INF 1000000000 //1e9 #define LLINF 2000000000000000000LL //2e18 #define SIZE 101000 int n,m; int a[SIZE]; ll sum[SIZE]; ll dp[2][SIZE]; int dp_back[201][SIZE]; int deq[SIZE]; ll f_a(int t){ return sum[t]; } ll f_b(int k, int t){ return - sum[n]*sum[t] + dp[k][t]; } ll f(int k, int t, int x){ return f_a(t) * sum[x] + f_b(k,t); } bool check(int k,int f1, int f2, int f3){ ll a = (f_a(f2)-f_a(f1)) * (f_b(k,f3)-f_b(k,f2)); ll b = (f_b(k,f2)-f_b(k,f1)) * (f_a(f3)-f_a(f2)); return a >= b; } int main(){ scanf("%d%d",&n,&m); sum[0] = a[0] = 0; for(int i=1;i<=n;i++){ scanf("%d",a+i); sum[i] = sum[i-1] + a[i]; } dp[0][0] = 0; for(int i=0;i<m;i++){ int s=0, t=1; deq[0] = 0; for(int j=1;j<=n;j++){ while(s+1 < t && f(i%2,deq[s],j) < f(i%2,deq[s+1],j)) s++; dp[1-i%2][j] = sum[n]*sum[j] - sum[j]*sum[j] + f(i%2,deq[s],j); dp_back[i+1][j] = deq[s]; while(s+1 < t && check(i%2,deq[t-2], deq[t-1], j)) t--; deq[t++] = j; } } ll ans = 0; int p = 0; for(int i=0;i<=n;i++){ if(ans <= dp[m%2][i]){ p = i; ans = dp[m%2][i]; } } vector<int> vec; vec.push_back(p); for(int i=m;i>1;i--){ p = dp_back[i][p]; vec.push_back(p); } /* for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ cerr << i << " " << j << " : " << dp[i][j] << endl; } } */ printf("%lld\n",ans); for(int i=vec.size()-1;i>=0;i--){ printf("%d%c",vec[i]," \n"[i==0]); } return 0; }

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:56:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&n,&m);
   ~~~~~^~~~~~~~~~~~~~
sequence.cpp:61:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",a+i);
     ~~~~~^~~~~~~~~~
#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...