제출 #154857

#제출 시각아이디문제언어결과실행 시간메모리
154857srvlt수열 (APIO14_sequence)C++14
50 / 100
2060 ms5656 KiB
//#pragma GCC optimize("Ofast") //#pragma GCC target("sse2,avx") #include <bits/stdc++.h> #define ll long long #define db long double #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define fi first #define se second #define mp make_pair #define endl "\n" #define int long long using namespace std; void dout() { cerr << endl; } template <typename Head, typename... Tail> void dout(Head H, Tail... T) { cerr << H << ' '; dout(T...); } mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); typedef pair <int, int> pii; const int N = 1e5 + 3, K = 203; int n, k, a[N], dp[K][N], p[N], last[K][N]; struct line { int k = 0, b = 0; int val(int x) { return k * x + b; } db intrsc(const line & l) const { return (db)(l.b - b) / (k - l.k); } bool del(line & l1, line & l2) const { // return false; if (k == l1.k) { return b > l1.b; } return intrsc(l2) > l1.intrsc(l2); } }; vector <line> h; vector <int> ind, ans; void upd(int x, int y, int pos) { line tmp; tmp.k = x, tmp.b = y; while (h.size() > 1 && tmp.del(h[h.size() - 1], h[h.size() - 2])) { h.ppb(); ind.ppb(); } h.pb(tmp); ind.pb(pos); } pii getmax(int x) { if (h.empty()) { return {0, 0}; } // int l = 0, r = h.size() - 1; // while (l < r) { // int mid = (l + r) / 2; // if (h[mid].val(x) < h[mid + 1].val(x)) { // l = mid + 1; // } else { // r = mid; // } // } // return {h[l].val(x), ind[l]}; int mx = -1; for (int i = 0; i < h.size(); i++) { if (mx == -1 || h[i].val(x) > h[mx].val(x)) { mx = i; } } return {h[mx].val(x), ind[mx]}; } void getans(int x, int y) { if (!y) { return; } ans.pb(y); getans(x - 1, last[x][y]); } void solve(int tc) { cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> a[i]; p[i] = p[i - 1] + a[i]; } for (int i = 1; i <= k; i++) { h = {}; ind = {}; for (int j = 1; j < i; j++) { if (i > 1) { upd(-p[j], dp[i - 1][j], j); } } for (int j = i; j < n; j++) { int x = p[n] - p[j]; pii z = getmax(x); dp[i][j] = p[j] * x + z.fi; last[i][j] = z.se; if (i > 1) { upd(-p[j], dp[i - 1][j], j); } } } int res = -1; for (int i = 1; i < n; i++) { if (res == -1 || dp[k][res] < dp[k][i]) { res = i; } } getans(k, res); cout << dp[k][res] << endl; reverse(ans.begin(), ans.end()); for (auto i : ans) { cout << i << " "; } } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); int tc = 1; // cin >> tc; for (int i = 0; i < tc; i++) { solve(i); // cleanup(); } }

컴파일 시 표준 에러 (stderr) 메시지

sequence.cpp: In function 'pii getmax(long long int)':
sequence.cpp:78:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < h.size(); 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...