Submission #1183371

#TimeUsernameProblemLanguageResultExecution timeMemory
1183371DeMen100nsCandies (JOI18_candies)C++17
100 / 100
305 ms13456 KiB
/* Author : DeMen100ns (Vo Khac Trieu) School: University of Science, VNU-HCM Aim: - International Grandmaster Codeforces (2600) - ICPC World Final 2025 */ #include <bits/stdc++.h> #define int long long using namespace std; const long long INF = numeric_limits<long long>::max() / 8; const int INF_int = 1e9 + 7; vector <int> max_plus(vector <int> a, vector <int> b){ // for(int i : a) cout << i << " "; // cout << "+ "; // for(int i : b) cout << i << " "; // cout << "= "; int n = a.size(), m = b.size(); vector <int> ans(n + m - 1, 0); ans[0] = a[0] + b[0]; for(int k = 1, i = 0, j = 0; k < n + m - 1; ++k){ int option = -1; if (i == n - 1){ option = 1; } else if (j == m - 1){ option = 0; } else{ if (a[i + 1] - a[i] > b[j + 1] - b[j]){ option = 0; } else option = 1; } if (!option){ ans[k] = ans[k - 1] + a[i + 1] - a[i]; ++i; } else { ans[k] = ans[k - 1] + b[j + 1] - b[j]; ++j; } } // for(int i : ans) cout << i << " "; cout << endl; return ans; } array<vector<int>, 4> dnc(vector <int> &a, int l, int r){ if (l == r){ return array<vector<int>, 4>({vector<int>({0}), vector<int>({-INF}), vector<int>({-INF}), vector<int>({-INF, a[l]})}); } int mid = (l + r) >> 1; array<vector<int>, 4> L = dnc(a, l, mid), R = dnc(a, mid + 1, r); //cout << l << "->" << r << ":" << endl; array<vector<int>, 4> res; for(int l = 0; l <= 1; ++l){ for(int r = 0; r <= 1; ++r){ vector <int> ans = {}; for(int midl = 0; midl <= 1; ++midl){ for(int midr = 0; midr <= 1; ++midr){ if (midl && midr) continue; // cout << l << "-" << midl << " + " << midr << "-" << r << endl; vector <int> F = max_plus(L[l << 1 | midl], R[midr << 1 | r]); for(int i = 0; i < F.size(); ++i){ if (i >= ans.size()) ans.push_back(F[i]); else ans[i] = max(ans[i], F[i]); } } } res[l << 1 | r] = ans; } } return res; } void solve(){ int n; cin >> n; vector <int> a(n); for(int &x : a) cin >> x; array<vector<int>, 4> ans = dnc(a, 0, n - 1); for(int i = 1; i <= (n + 1) / 2; ++i){ int res = -1; for(int j = 0; j < 4; ++j){ if (ans[j].size() > i) res = max(res, ans[j][i]); } if (res == -1) res = 0; cout << res << '\n'; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; // cin >> t; for(int test = 1; test <= t; ++test){ solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...