Submission #948938

#TimeUsernameProblemLanguageResultExecution timeMemory
948938IBorySplit the sequence (APIO14_sequence)C++17
100 / 100
552 ms84948 KiB
#include <bits/stdc++.h> #define pii pair<ll, ll> typedef long long ll; using namespace std; const int MAX = 100007; int pv[202][MAX]; ll dp[2][MAX], P[MAX]; ll idx; vector<double> idxs; vector<int> pid; vector<pii> S; inline double Point(pii a, pii b) { if (a.first == b.first) return 0; return (double)(b.second - a.second) / (double)(a.first - b.first); } void Insert(pii line, int id) { while (S.size() > 1) { pii& pv = S[S.size() - 1], ppv = S[S.size() - 2]; double cur = Point(ppv, pv), insert = Point(pv, line); if (cur <= insert) break; S.pop_back(); idxs.pop_back(); pid.pop_back(); } if (!S.empty()) idxs.push_back(Point(S.back(), line)); S.push_back(line); pid.push_back(id); } pii GetLinear(ll x) { while (idx < S.size() - 1 && Point(S[idx], S[idx + 1]) <= x) idx++; return { S[idx].first * x + S[idx].second, pid[idx] }; } int main() { ios::sync_with_stdio(0); cin.tie(0); int N, K; cin >> N >> K; for (int i = 1; i <= N; ++i) { cin >> P[i]; P[i] += P[i - 1]; } for (int k = 1; k <= K; ++k) { swap(dp[0], dp[1]); dp[0][0] = -2e9; idx = 0; idxs.clear(); S.clear(); pid.clear(); Insert({ 0, 0 }, 0); for (int i = 1; i <= N; ++i) { pii q = GetLinear(P[i]); dp[1][i] = q.first; pv[k][i] = q.second; Insert({ P[i], dp[0][i] - P[i] * P[i] }, i); } } cout << dp[1][N] << '\n'; vector<int> ans; int cur = N; for (int k = K; k > 0; --k) { ans.push_back(pv[k][cur]); cur = pv[k][cur]; } for (int n : ans) cout << n << ' '; return 0; }

Compilation message (stderr)

sequence.cpp: In function 'std::pair<long long int, long long int> GetLinear(ll)':
sequence.cpp:35:13: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |  while (idx < S.size() - 1 && Point(S[idx], S[idx + 1]) <= x) idx++;
      |         ~~~~^~~~~~~~~~~~~~
#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...