제출 #875112

#제출 시각아이디문제언어결과실행 시간메모리
875112rakkoon69Feast (NOI19_feast)C++17
100 / 100
74 ms8176 KiB
#include <bits/stdc++.h> #define int long long #define ll long long #define II pair<int, int> #define fs first #define sc second #define endl '\n' #define mp(x, y) make_pair(x, y) #define sz(x) ((int) (x.size())) #define forlr(i, l, r) for(int i = l; i <= r; ++i) #define forrl(i, r, l) for(int i = r; i >= l; --i) #define show(v) for(auto i : v) cout << i << " "; cout << endl; #define showlr(v, l, r) for (int i = l; i <= r; i++) cout << v[i] << " "; cout << endl; #define all(v) v.begin(), v.end() #define Unique(v) v.erase(unique(all(v)), v.end()); const long long LINF = 1ll << 60; const int INF = 1 << 30; const int N = 3e5 + 5; using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int n, k; int a[N], p[N]; II choose(II A, II B) { if(A.fs == B.fs) return A.sc < B.sc ? A : B; return A.fs > B.fs ? A : B; } II calc(int cost) { II take = {0, 0}, best = {0, 0}; forlr(i, 1, n) { best = choose(best, {take.fs + p[i] - cost, take.sc + 1}); take = choose(take, {best.fs - p[i], best.sc}); } return best; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> k; forlr(i, 1, n) { cin >> a[i]; p[i] = p[i - 1] + a[i]; } int ans = 0; int lo = 0, hi = 3e14; while(lo <= hi) { int mid = (lo + hi) >> 1; II v = calc(mid); if(v.sc > k) lo = mid + 1; else hi = mid - 1, ans = v.fs + k * mid; } cout << ans << endl; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...