Skip to content

Commit 2fba763

Browse files
authored
Create 2286-booking-concert-tickets-in-groups.js
1 parent dee7d33 commit 2fba763

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/**
2+
* @param {number} n
3+
* @param {number} m
4+
*/
5+
function BookMyShow(n, m) {
6+
let a = Array(n).fill(0), st = new SegmentTreeRMQ(a), fen = new Fenwick(n + 3);
7+
for (let i = 0; i < n; i++) fen.update(i, m);
8+
return { gather, scatter }
9+
function gather(k, maxRow) {
10+
let idx = st.indexOf(0, m - k);
11+
if (idx == -1 || idx > maxRow) return [];
12+
let min = st.minx(idx, idx + 1);
13+
st.update(idx, min + k);
14+
fen.update(idx, -k);
15+
return [idx, min];
16+
}
17+
function scatter(k, maxRow) {
18+
let totToMaxRow = fen.query(maxRow);
19+
if (totToMaxRow < k) return false;
20+
while (k > 0) {
21+
let idx = st.indexOf(0, m - 1);
22+
if (idx == -1 || idx > maxRow) break;
23+
let min = st.minx(idx, idx + 1);
24+
let use = Math.min(k, m - min);
25+
k -= use;
26+
st.update(idx, min + use);
27+
fen.update(idx, -use);
28+
}
29+
return true;
30+
}
31+
}
32+
33+
/**
34+
* Your BookMyShow object will be instantiated and called as such:
35+
* var obj = new BookMyShow(n, m)
36+
* var param_1 = obj.gather(k,maxRow)
37+
* var param_2 = obj.scatter(k,maxRow)
38+
*/
39+
////////////////////////////////////////////////// Template ////////////////////////////////////////////////////////////////////
40+
function Fenwick(n) {
41+
let a = Array(n).fill(0);
42+
return { query, update, rangeSum, tree }
43+
function query(i) { // [0, i] prefix sum
44+
let sum = 0;
45+
for (i++; i > 0; i = parent(i)) sum += a[i];
46+
return sum;
47+
}
48+
function update(i, v) {
49+
for (i++; i < n; i = next(i)) a[i] += v;
50+
}
51+
function rangeSum(l, r) {
52+
return query(r) - query(l - 1);
53+
}
54+
function parent(x) {
55+
return x - lowestOneBit(x);
56+
}
57+
function next(x) {
58+
return x + lowestOneBit(x);
59+
}
60+
function lowestOneBit(x) {
61+
return x & -x;
62+
}
63+
function tree() {
64+
return a;
65+
}
66+
}
67+
68+
function SegmentTreeRMQ(A) {
69+
let n = A.length, h = Math.ceil(Math.log2(n)), len = 2 * 2 ** h, a = Array(len).fill(Number.MAX_SAFE_INTEGER);
70+
h = 2 ** h;
71+
initializeFromArray();
72+
return { update, minx, indexOf, tree }
73+
function initializeFromArray() {
74+
for (let i = 0; i < n; i++) a[h + i] = A[i];
75+
for (let i = h - 1; i >= 1; i--) propagate(i);
76+
}
77+
function update(pos, v) {
78+
a[h + pos] = v;
79+
for (let i = parent(h + pos); i >= 1; i = parent(i)) propagate(i);
80+
}
81+
function propagate(i) {
82+
a[i] = Math.min(a[left(i)], a[right(i)]);
83+
}
84+
function minx(l, r) {
85+
let min = Number.MAX_SAFE_INTEGER;
86+
if (l >= r) return min;
87+
l += h;
88+
r += h;
89+
for (; l < r; l = parent(l), r = parent(r)) {
90+
if (l & 1) min = Math.min(min, a[l++]);
91+
if (r & 1) min = Math.min(min, a[--r]);
92+
}
93+
return min;
94+
}
95+
function indexOf(l, v) {
96+
if (l >= h) return -1;
97+
let cur = h + l;
98+
while (1) {
99+
if (a[cur] <= v) {
100+
if (cur >= h) return cur - h;
101+
cur = left(cur);
102+
} else {
103+
cur++;
104+
if ((cur & cur - 1) == 0) return -1;
105+
if (cur % 2 == 0) cur = parent(cur);
106+
}
107+
}
108+
}
109+
function parent(i) {
110+
return i >> 1;
111+
}
112+
function left(i) {
113+
return 2 * i;
114+
}
115+
function right(i) {
116+
return 2 * i + 1;
117+
}
118+
function tree() {
119+
return a;
120+
}
121+
}
122+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
123+

0 commit comments

Comments
 (0)