#include "bits/stdc++.h"
#include "candies.h"
using namespace std;
using ll = long long;
const ll inf = 1e16;
const int N = 4e5 + 10;
struct node {
ll mn, mx, posmn, posmx;
};
node neutral = {inf, -inf, -1, -1};
node t[4 * N];
ll lazy[4 * N];
void push(int i, int l, int r) {
if(!lazy[i]) return;
t[i].mn += lazy[i];
t[i].mx += lazy[i];
if(l != r) {
lazy[2 * i] += lazy[i];
lazy[2 * i + 1] += lazy[i];
}
lazy[i] = 0;
}
node merge(node a, node b) {
if(a.mn == -1) return b;
if(b.mn == -1) return a;
node c;
c.mn = min(a.mn, b.mn);
c.mx = max(a.mx, b.mx);
c.posmn = (a.mn < b.mn ? a.posmn : b.posmn);
c.posmx = (a.mx > b.mx ? a.posmx : b.posmx);
return c;
}
void modif(int i, int l, int r, int tl, int tr, ll val) {
push(i, l, r);
if(l > tr || r < tl) return;
if(l >= tl && r <= tr) {
lazy[i] += val;
push(i, l, r);
return;
}
int mid = l + r >> 1;
modif(2 * i, l, mid, tl, tr, val);
modif(2 * i + 1, mid + 1, r, tl, tr, val);
t[i] = merge(t[2 * i], t[2 * i + 1]);
}
node query(int i, int l, int r, int tl, int tr) {
push(i, l, r);
if(l > tr || r < tl) return neutral;
if(l >= tl && r <= tr) return t[i];
int mid = l + r >> 1;
return merge(query(2 * i, l, mid, tl, tr), query(2 * i + 1, mid + 1, r, tl, tr));
}
void build(int i, int l, int r) {
if(l > r) return;
if(l == r) {
t[i].mx = t[i].mn = 0;
t[i].posmn = t[i].posmx = l;
lazy[i] = 0;
return;
}
int mid = l + r >> 1;
build(2 * i, l, mid);
build(2 * i + 1, mid + 1, r);
t[i] = merge(t[2 * i], t[2 * i + 1]);
}
std::vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) {
int n = c.size(), q = l.size();
build(1, 0, q);
vector<ll> a(n, 0);
vector<vector<int>> st(n + 1), en(n + 1);
for(int i = 0; i < q; ++i) {
st[l[i]].push_back(i);
en[r[i] + 1].push_back(i);
}
for(int i = 0; i < n; ++i) {
for(auto j: en[i]) {
modif(1, 0, q, j + 1, q, -v[j]);
}
for(auto j: st[i]) {
modif(1, 0, q, j + 1, q, v[j]);
}
if(query(1, 0, q, q, q).mx >= c[i]) {
a[i] = c[i];
continue;
}
if(query(1, 0, q, q, q).mx <= -c[i]) {
a[i] = 0;
continue;
}
int l = 0, r = q - 1, pos = -1;
while(l <= r) {
int mid = l + r >> 1;
node x = query(1, 0, q, mid, q);
if(x.mx - x.mn >= c[i]) {
pos = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
if(pos != -1) {
node x = query(1, 0, q, pos, q);
if(x.posmx < x.posmn) {
a[i] = 0;
} else {
a[i] = c[i];
}
int j = max(x.posmn, x.posmx);
if(j + 1 <= q) {
node x = query(1, 0, q, j + 1, q);
ll MN = x.mn - query(1, 0, q, j, j).mn;
ll MX = x.mx - query(1, 0, q, j, j).mn;
assert(MN > -c[i]);
assert(MX < c[i]);
if(!a[i] && MN < 0) a[i] -= MN;
else if(a[i] == c[i] && MX > 0) a[i] -= MX;
a[i] += query(1, 0, q, q, q).mx - query(1, 0, q, j, j).mx;
assert(a[i] >= 0 && a[i] <= c[i]);
}
} else {
node x = query(1, 0, q, q, q);
a[i] = x.mx;
x = query(1, 0, q, 0, q);
if(x.mn < 0) a[i] -= x.mn;
assert(a[i] >= 0 && a[i] <= c[i]);
}
}
vector<int> cc(n);
for(int i = 0; i < n; ++i) cc[i] = a[i];
return cc;
}
/*
3
10 15 13
2
0 2 20
0 1 -11
*/
Compilation message
candies.cpp: In function 'void modif(int, int, int, int, int, ll)':
candies.cpp:46:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
46 | int mid = l + r >> 1;
| ~~^~~
candies.cpp: In function 'node query(int, int, int, int, int)':
candies.cpp:55:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
55 | int mid = l + r >> 1;
| ~~^~~
candies.cpp: In function 'void build(int, int, int)':
candies.cpp:66:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
66 | int mid = l + r >> 1;
| ~~^~~
candies.cpp: In function 'std::vector<int> distribute_candies(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
candies.cpp:99:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
99 | int mid = l + r >> 1;
| ~~^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
511 ms |
46024 KB |
Output is correct |
2 |
Correct |
581 ms |
46024 KB |
Output is correct |
3 |
Correct |
773 ms |
46020 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |