#include "candies.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int BS = 256;
vector<ll> compute_function(const vector<int>& ops) {
vector<ll> stk;
stk.push_back(4e18);
stk.push_back(2e18);
for (auto delta : ops) {
if (delta == 0) continue;
if (delta > 0) {
ll rem = delta, px = 0;
while (true) {
ll x = stk.back();
if (x - px > rem) {
stk.push_back(px + rem);
stk.push_back(0);
break;
}
rem -= (x - px);
stk.pop_back();
px = stk.back();
stk.pop_back();
}
} else {
ll rem = -delta;
while (true) {
ll px = stk.back(); stk.pop_back();
ll x = stk.back();
if (x - px > rem) {
stk.push_back(px + rem);
break;
}
rem -= (x - px);
stk.pop_back();
}
}
}
stk.push_back(0);
stk.push_back(0);
reverse(stk.begin(), stk.end());
return stk;
}
vector<int> distribute_candies(
vector<int> c, vector<int> l,
vector<int> r, vector<int> v) {
int n = c.size();
// Sort each bucket increasingly by c[i] to facilitate easy evaluation of f.
vector<int> order(n);
iota(order.begin(), order.end(), 0);
for (int i = 0; i < n; i += BS) {
int j = min(i + BS, n);
sort(order.begin() + i, order.begin() + j, [&](int a, int b) {
return c[a] < c[b];
});
}
vector<ll> stk;
vector<int> a(n, 0), na(n, 0);
vector<vector<int>> ops(n / BS + 1);
auto commit = [&](int bi) {
if (ops[bi].empty()) return;
int l = bi * BS, r = min(n, (bi + 1) * BS);
// compute f(.) and evaluate it in all c[i] of this bucket
auto stk = compute_function(ops[bi]);
ll value = 0;
int ptr = 0;
for (int i = l; i < r; ++i) {
int ci = c[order[i]];
while (stk[ptr + 1] < ci) {
if (ptr % 2 == 0)
value += stk[ptr + 1] - stk[ptr];
++ptr;
}
if (ptr % 2 == 0) {
na[order[i]] = value + (ci - stk[ptr]);
} else {
na[order[i]] = value;
}
}
// Adapt for non-zero initial values.
ll mind = 0, maxd = 0, nowd = 0;
for (auto x : ops[bi]) {
nowd += x;
mind = min(mind, nowd);
maxd = max(maxd, nowd);
}
for (int i = l; i < r; ++i) {
ll hi = min(c[i] - maxd, (ll)a[i]);
ll lo = -mind;
if (lo < hi)
na[i] += hi - lo;
}
// Housekeeping.
for (int i = l; i < r; ++i)
a[i] = na[i];
ops[bi].clear();
};
int q = l.size();
for (int i = 0; i < q; ++i) {
int bl = l[i] / BS, br = r[i] / BS;
commit(bl); commit(br);
for (int j = l[i]; j <= r[i]; ) {
if (j % BS == 0 && (j + BS - 1) <= r[i]) {
ops[j / BS].push_back(v[i]);
j += BS;
} else {
a[j] = max(0, min(a[j] + v[i], c[j]));
j += 1;
}
}
if (i % BS == 0)
for (int i = 0; i < n; i += BS)
commit(i / BS);
}
for (int i = 0; i < n; i += BS)
commit(i / BS);
return a;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
332 KB |
Output is correct |
4 |
Correct |
2 ms |
332 KB |
Output is correct |
5 |
Correct |
8 ms |
332 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3703 ms |
9620 KB |
Output is correct |
2 |
Correct |
3994 ms |
9612 KB |
Output is correct |
3 |
Correct |
3654 ms |
9528 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
528 ms |
5032 KB |
Output is correct |
3 |
Correct |
96 ms |
4660 KB |
Output is correct |
4 |
Correct |
2860 ms |
9564 KB |
Output is correct |
5 |
Correct |
2744 ms |
9672 KB |
Output is correct |
6 |
Correct |
3009 ms |
9548 KB |
Output is correct |
7 |
Correct |
2919 ms |
9532 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
676 ms |
5044 KB |
Output is correct |
4 |
Correct |
125 ms |
5088 KB |
Output is correct |
5 |
Correct |
4229 ms |
9756 KB |
Output is correct |
6 |
Correct |
4170 ms |
9752 KB |
Output is correct |
7 |
Correct |
3637 ms |
9756 KB |
Output is correct |
8 |
Correct |
4298 ms |
9756 KB |
Output is correct |
9 |
Correct |
3554 ms |
9756 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
332 KB |
Output is correct |
4 |
Correct |
2 ms |
332 KB |
Output is correct |
5 |
Correct |
8 ms |
332 KB |
Output is correct |
6 |
Correct |
3703 ms |
9620 KB |
Output is correct |
7 |
Correct |
3994 ms |
9612 KB |
Output is correct |
8 |
Correct |
3654 ms |
9528 KB |
Output is correct |
9 |
Correct |
1 ms |
204 KB |
Output is correct |
10 |
Correct |
528 ms |
5032 KB |
Output is correct |
11 |
Correct |
96 ms |
4660 KB |
Output is correct |
12 |
Correct |
2860 ms |
9564 KB |
Output is correct |
13 |
Correct |
2744 ms |
9672 KB |
Output is correct |
14 |
Correct |
3009 ms |
9548 KB |
Output is correct |
15 |
Correct |
2919 ms |
9532 KB |
Output is correct |
16 |
Correct |
1 ms |
204 KB |
Output is correct |
17 |
Correct |
1 ms |
204 KB |
Output is correct |
18 |
Correct |
676 ms |
5044 KB |
Output is correct |
19 |
Correct |
125 ms |
5088 KB |
Output is correct |
20 |
Correct |
4229 ms |
9756 KB |
Output is correct |
21 |
Correct |
4170 ms |
9752 KB |
Output is correct |
22 |
Correct |
3637 ms |
9756 KB |
Output is correct |
23 |
Correct |
4298 ms |
9756 KB |
Output is correct |
24 |
Correct |
3554 ms |
9756 KB |
Output is correct |
25 |
Correct |
1 ms |
204 KB |
Output is correct |
26 |
Correct |
100 ms |
4672 KB |
Output is correct |
27 |
Correct |
610 ms |
5040 KB |
Output is correct |
28 |
Correct |
4372 ms |
9536 KB |
Output is correct |
29 |
Correct |
3970 ms |
9632 KB |
Output is correct |
30 |
Correct |
3704 ms |
9532 KB |
Output is correct |
31 |
Correct |
3188 ms |
9520 KB |
Output is correct |
32 |
Correct |
2986 ms |
9540 KB |
Output is correct |