제출 #814297

#제출 시각아이디문제언어결과실행 시간메모리
814297LittleCubeDistributing Candies (IOI21_candies)C++17
0 / 100
123 ms11904 KiB
#include "candies.h" #include <bits/stdc++.h> #define ll long long using namespace std; // find last reset, // for larger c, the suffix does not reset so only compute prefix // for smaller c, the prefix always reset so only compute suffix namespace { int n, q; vector<int> c, v, res, ord, ans; void solve(int l, int r, int ql, int qr, ll suf, ll reset) { if (r < l) return; ll sum = 0; // calculate mid int mid = (l + r) / 2, cur = reset * c[mid], last = ql - 1, type = reset; // cerr << l << ' ' << mid << ' ' << r << ' ' << ql << ' ' << qr << ' ' << reset << '\n'; for (int i = ql; i <= qr; i++) { int nxt = cur + v[i]; sum += v[i]; if (nxt > c[mid]) last = i, type = 1, nxt = c[mid], sum = 0; else if (nxt < 0) last = i, type = 0, nxt = 0, sum = 0; cur = nxt; } res[mid] = cur + suf; solve(l, mid - 1, last + 1, qr, suf, type); solve(mid + 1, r, ql, last, sum + suf, reset); } } vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { n = c.size(), q = l.size(); ::c = c, ::v = v; res.resize(n); ans.resize(n); ord.resize(n); for (int i = 0; i < n; i++) ord[i] = i; sort(ord.begin(), ord.end(), [&](int i, int j) { return c[i] < c[j]; }); sort(c.begin(), c.end()); solve(0, n - 1, 0, q - 1, 0, 0); for (int i = 0; i < n; i++) ans[ord[i]] = res[i]; return ans; }
#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...