Submission #46305

#TimeUsernameProblemLanguageResultExecution timeMemory
46305RayaBurong25_1Split the sequence (APIO14_sequence)C++17
71 / 100
2064 ms86824 KiB
#include <stdio.h> #include <vector> #include <algorithm> #define INF 1e18 long long Sum[100005]; long long DP[100005]; int Last[100005][205]; typedef struct line line; struct line { long long m, c; double s; int i; }; std::vector<line> Lines; long long max(long long a, long long b) { return (a > b)?a:b; } int compare(long long x, line l) { return x < l.s; } int I; long long getLine(long long x) { int j = std::upper_bound(Lines.begin(), Lines.end(), x, compare) - Lines.begin() - 1; I = Lines[j].i; return Lines[j].m*x + Lines[j].c; } double intersect(long long m, long long c, long long m2, long long c2) { if (m == m2) { if (c2 >= c) return -INF; else return INF; } else return (double) (c2 - c)/(m - m2); } void insertLine(int i, long long m, long long c) { double s; while (!Lines.empty() && (s = intersect(Lines.back().m, Lines.back().c, m, c)) <= Lines.back().s) Lines.pop_back(); if (s != INF) Lines.push_back({m, c, s, i}); } int main() { int N, K; scanf("%d %d", &N, &K); int n, k, i; for (i = 0; i < N; i++) { scanf("%lld", &Sum[i]); if (i > 0) Sum[i] += Sum[i - 1]; } // Lines.push_back({0, 0, 0}); long long r; for (k = 0; k <= K; k++) { Lines.resize(0); Lines.push_back({0, 0, -INF, -1}); for (n = 0; n < N; n++) { r = getLine(Sum[n]); Last[n][k] = I; // for (i = 0; i < n; i++) // { // if (DP[i][k - 1] + Sum[i]*(Sum[n] - Sum[i]) > DP[n][k]) // { // DP[n][k] = max(DP[n][k], DP[i][k - 1] + Sum[i]*(Sum[n] - Sum[i])); // Last[n][k] = i; // } // } if (k > 0 && n < N - 1) insertLine(n, Sum[n], DP[n] - Sum[n]*Sum[n]); DP[n] = r; // printf("DP[%d][%d] = %lld\n", n, k, DP[n]); } } printf("%lld\n", DP[N - 1]); i = Last[N - 1][K]; k = K - 1; std::vector<int> V; while (k >= 0 && i != -1) { V.push_back(i + 1); i = Last[i][k]; k--; } for (i = V.size() - 1; i >= 0; i--) printf("%d ", V[i]); }

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:54:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &N, &K);
     ~~~~~^~~~~~~~~~~~~~~~~
sequence.cpp:58:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld", &Sum[i]);
         ~~~~~^~~~~~~~~~~~~~~~~
sequence.cpp: In function 'void insertLine(int, long long int, long long int)':
sequence.cpp:49:24: warning: 's' may be used uninitialized in this function [-Wmaybe-uninitialized]
         Lines.push_back({m, c, s, 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...