Submission #92753

#TimeUsernameProblemLanguageResultExecution timeMemory
92753davitmargSplit the sequence (APIO14_sequence)C++17
100 / 100
1388 ms87840 KiB
/* DEATH-MATCH Davit-Marg */ #include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <map> #include <set> #include <queue> #include <deque> #include <stack> #include <iterator> #include <ctype.h> #include <stdlib.h> #include <cassert> #include <fstream> #define mod 1000000007ll #define LL long long #define LD long double #define MP make_pair #define PB push_back using namespace std; int n,k; LL a[100005],pr[100005],dp[2][100005]; int nxt[202][100005]; LL sum(int l, int r) { return pr[r] - pr[l - 1]; } struct line { int i; LL k, b; line(LL kk=0, LL bb=0,int ii=0) { k = kk; b = bb; i = ii; } }; LL solve(line p, line q) { return (q.b - p.b) / (p.k - q.k); } int main() { cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> a[i]; pr[i] = pr[i - 1] + a[i]; } for (int z = 1; z <= k; z++) { int i = z % 2; int l = !i; vector<line> s; int ans=0; for (int j = n; j >= 1; j--) { line add = line(pr[j], dp[l][j + 1] - pr[j] * pr[j], j); while (s.size() > 1 && ((s[s.size() - 1].k == add.k && add.b >= s[s.size() - 1].b) || (s[s.size() - 1].k != add.k && solve(s[s.size() - 1], add) > solve(s[s.size() - 2], add)))) s.pop_back(); s.PB(add); ans = min(ans, (int)s.size() - 1); LL X = pr[n] + pr[j - 1]; while (ans < s.size()-1 && s[ans].k*X + s[ans].b <= s[ans + 1].k*X + s[ans + 1].b) ans++; dp[i][j] = s[ans].k*X + s[ans].b - pr[j - 1] * pr[n]; nxt[z][j] = s[ans].i; } } cout << dp[k%2][1] << endl; for (int i = k,l=1; i >= 1; i--) { cout << nxt[i][l] << " "; l = nxt[i][l] + 1; } cout << endl; return 0; } /* 3 1 2 1 2 40 3 7 5 7 5 1 2 3 4 6 7 8 2 1 2 3 4 6 7 8 2 7 7 5 1 2 3 4 6 7 8 2 5 1 2 3 4 6 7 8 2 7 3 4 1 3 4 0 2 3 */

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:77:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while (ans < s.size()-1 && s[ans].k*X + s[ans].b <= s[ans + 1].k*X + s[ans + 1].b)
           ~~~~^~~~~~~~~~~~
#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...