1
+ // https://leetcode.com/problems/fruits-into-baskets-iii
2
+ // Basically optimize the brute force with data structures
3
+ // Segment tree + binary search to find first index with value >= val`
4
+ // TC: O(n * log^2(n))
5
+
6
+ #include < bits/stdc++.h>
7
+
8
+ using namespace std ;
9
+
10
+ class SegTree {
11
+ vector<int > seg;
12
+ function<int (int , int )> f;
13
+ int default_val, N;
14
+
15
+ public:
16
+ SegTree (vector<int > &arr, function<int (int , int )> f, int default_val) : f(f), default_val(default_val) {
17
+ int layers = ceil (log2 (arr.size ()));
18
+ N = 1 << layers;
19
+ seg.resize (N << 1 , default_val);
20
+ for (size_t i = 0 ; i < arr.size (); ++i)
21
+ seg[i + N] = arr[i];
22
+ for (int i = N - 1 ; i > 0 ; --i)
23
+ seg[i] = f (seg[i << 1 ], seg[(i << 1 ) | 1 ]);
24
+ }
25
+
26
+ void update (int i, int val) {
27
+ for (seg[i += N] = val; i > 1 ; i >>= 1 )
28
+ seg[i >> 1 ] = f (seg[i], seg[i ^ 1 ]);
29
+ }
30
+
31
+ int query (int l, int r) {
32
+ int resl = default_val, resr = default_val;
33
+ for (l += N, r += N; l <= r; l >>= 1 , r >>= 1 ) {
34
+ if (l & 1 ) resl = f (resl, seg[l++]);
35
+ if (!(r & 1 )) resr = f (seg[r--], resr);
36
+ }
37
+ return f (resl, resr);
38
+ }
39
+ };
40
+
41
+ int mx (int a, int b) { // functions for the segment tree
42
+ return max (a, b);
43
+ }
44
+
45
+ class Solution {
46
+ public:
47
+ int numOfUnplacedFruits (vector<int > &fruits, vector<int > &baskets) {
48
+ SegTree seg (baskets, mx, 0 );
49
+ int n = fruits.size ();
50
+
51
+ int skipped = 0 ;
52
+ for (auto val: fruits) {
53
+ if (seg.query (0 , n - 1 ) < val) { // none available
54
+ skipped += 1 ;
55
+ continue ;
56
+ }
57
+
58
+ int low = 0 ;
59
+ int high = n - 1 ;
60
+ int ans = n - 1 ;
61
+ while (low <= high) {
62
+ int mid = (low + high) / 2 ;
63
+ if (seg.query (0 , mid) >= val) {
64
+ ans = mid;
65
+ high = mid - 1 ;
66
+ } else {
67
+ low = mid + 1 ;
68
+ }
69
+ }
70
+ seg.update (ans, -1 );
71
+ }
72
+ return skipped;
73
+ }
74
+ };
75
+
76
+ int main () {
77
+ ios_base::sync_with_stdio (false );
78
+ cin.tie (nullptr );
79
+
80
+
81
+ return 0 ;
82
+ }
0 commit comments