Submission #716704

#TimeUsernameProblemLanguageResultExecution timeMemory
716704Sohsoh84Candies (JOI18_candies)C++17
100 / 100
762 ms16364 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; #define all(x) (x).begin(),(x).end() #define X first #define Y second #define sep ' ' #define endl '\n' #define debug(x) cerr << #x << ": " << x << endl; const ll MAXN = 1e6 + 10; ll n, A[MAXN]; vector<ll> merge_divide(vector<ll> a, vector<ll> b) { vector<ll> ans; int ap = 0, bp = 0, as = a.size(), bs = b.size(); ll f = 0; ans.push_back(f); while (ap + 1 < as || bp + 1 < bs) { if (ap + 1 >= as || (bp + 1 < bs && a[ap + 1] - a[ap] < b[bp + 1] - b[bp])) { f += b[bp + 1] - b[bp]; bp++; } else { f += a[ap + 1] - a[ap]; ap++; } ans.push_back(f); } return ans; } vector<ll> merge_max(vector<ll> a, vector<ll> b) { while (a.size() < b.size()) a.push_back(0); while (b.size() < a.size()) b.push_back(0); for (int i = 0; i < int(a.size()); i++) a[i] = max(a[i], b[i]); return a; } vector<vector<ll>> solve(int l, int r) { if (l == r) return {{0}, {0}, {0}, {0, A[l]}}; int mid = (l + r) >> 1; vector<vector<ll>> ans = {{0ll}, {0ll}, {0ll}, {0ll}}, A = solve(l, mid), B = solve(mid + 1, r); for (int a = 0; a < 4; a++) { for (int b = 0; b < 4; b++) { if ((a & 2) > 0 && (b & 1) > 0) continue; int c = (a & 1) | (b & 2); ans[c] = merge_max(ans[c], merge_divide(A[a], B[b])); } } return ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> A[i]; vector<ll> ans = solve(1, n)[3]; ans.erase(ans.begin()); for (ll e : ans) cout << e << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...