Submission #6964

#TimeUsernameProblemLanguageResultExecution timeMemory
6964tncks0121Split the sequence (APIO14_sequence)C++98
100 / 100
1408 ms84904 KiB
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <limits.h> #include <bits/stdc++.h> #include <memory.h> typedef long long ll; typedef unsigned long long llu; typedef double lf; typedef long double llf; typedef unsigned int uint; using namespace std; const int N_ = 100500, K_ = 205; int N, K, A[N_]; ll Table[2][N_], S[N_]; int opt[K_][N_]; void solve (int k, int i) { if(k == 1) return; solve(k - 1, opt[k][i] - 1); printf("%d ", opt[k][i] - 1); } ll *now, *prev; void conq (int k, int l, int r, int optl, int optr) { int m = (l+r) >> 1; for(int j = optl; j <= optr && j <= m; j++) { ll val = prev[j-1] + (S[m] - S[j-1]) * (S[N] - S[m]); if(val >= now[m]) now[m] = val, opt[k][m] = j; } if(l < r) { conq (k, l, m-1, optl, opt[k][m]); conq (k, m+1, r, opt[k][m], optr); } } int main() { scanf("%d%d", &N, &K); for(int i = 1; i <= N; i++) scanf("%d", A+i), S[i] = S[i-1] + A[i]; for(int i = 1; i <= N; i++) Table[1][i] = S[i] * (S[N] - S[i]); for(int k = 2; k <= K+1; k++) { now = Table[k&1], prev = Table[~k&1]; for(int i = 1; i <= N; i++) now[i] = -1, opt[k][i] = -1; conq(k, k, N, k, N); } printf("%lld\n", Table[~K&1][N]); solve(K+1, N); return 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...