bit/
lib.rs

1//! # BIT Binary Indexed Tree, Segment Tree, Ordered Set
2
3/// 493h Reverse Pairs
4struct Sol493 {}
5
6impl Sol493 {
7    /// 1 <= N <= 5*10^4
8    /// -2^31 <= N_i <= 2^31-1
9    pub fn reverse_pairs(nums: Vec<i32>) -> i32 {
10        let brute_force = || {
11            nums.iter()
12                .map(|&n| 2 * n as i64)
13                .enumerate()
14                .fold(0, |r, (i, rval)| {
15                    r + nums
16                        .iter()
17                        .take(i)
18                        .fold(0, |r, &n| if n as i64 > rval { r + 1 } else { r })
19                })
20        };
21
22        println!(":: {} (Brute Force)", brute_force());
23
24        let mut bits = vec![0; nums.len() + 1];
25        fn bits_update(bits: &mut [i64], mut i: usize, diff: i32) {
26            while i > 0 {
27                bits[i] += diff as i64;
28                i -= i & (!i + 1);
29            }
30        }
31        fn bits_query(bits: &[i64], mut i: usize) -> i64 {
32            let mut v = 0;
33            while i < bits.len() {
34                v += bits[i];
35                i += i & (!i + 1);
36            }
37            v
38        }
39
40        let mut sorted: Vec<_> = nums.iter().map(|&n| n as i64).collect();
41        sorted.sort_unstable();
42
43        fn bsearch(sorted: &[i64], t: i64) -> usize {
44            let (mut l, mut r) = (0, sorted.len());
45            while l < r {
46                let m = l + ((r - l) >> 1);
47                if sorted[m] < t {
48                    l = m + 1;
49                } else {
50                    r = m;
51                }
52            }
53
54            l
55        }
56
57        let mut count = 0;
58        for n in nums {
59            count += bits_query(&mut bits, bsearch(&sorted, 2 * n as i64 + 1) + 1);
60            bits_update(&mut bits, bsearch(&sorted, n as i64) + 1, 1);
61        }
62
63        count as _
64    }
65}
66
67/// 218h The Skyline Problems
68struct Sol218;
69
70impl Sol218 {
71    pub fn get_skyline(buildings: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
72        use std::collections::{BTreeSet, BinaryHeap};
73
74        println!("|| {:?}", buildings);
75
76        let mut sweep = BTreeSet::new();
77        for building in buildings.iter() {
78            sweep.insert(building[0]);
79            sweep.insert(building[1]);
80        }
81
82        println!("-> {:?}", sweep);
83
84        let mut pq = BinaryHeap::new();
85
86        let (mut i, mut h) = (0, 0);
87        let mut skyline = vec![];
88
89        for &x in sweep.iter() {
90            while i < buildings.len() && buildings[i][0] == x {
91                pq.push((buildings[i][2], buildings[i][0], buildings[i][1]));
92                i += 1;
93            }
94
95            while let Some(t) = pq.peek() {
96                if t.2 <= x {
97                    pq.pop();
98                } else {
99                    break;
100                }
101            }
102
103            if let Some(t) = pq.peek() {
104                if t.0 != h {
105                    skyline.push(vec![x, t.0]);
106                    h = t.0;
107                }
108            } else {
109                skyline.push(vec![x, 0]);
110                h = 0;
111            }
112        }
113
114        println!(":: {:?}", skyline);
115
116        skyline
117    }
118}
119
120/// 315h Count of Smaller Numbers After Self
121struct Sol315;
122
123impl Sol315 {
124    /// 1 <= N <= 10^5
125    /// -10^4 <= A_i <= 10^4
126    pub fn count_smaller(nums: Vec<i32>) -> Vec<i32> {
127        struct Bit {
128            fnodes: Vec<i32>,
129        }
130
131        impl Bit {
132            fn new(size: usize) -> Self {
133                Bit {
134                    fnodes: vec![0; size],
135                }
136            }
137
138            fn update(&mut self, mut i: i32) {
139                while (i as usize) < self.fnodes.len() {
140                    self.fnodes[i as usize] += 1;
141                    i += i & -i;
142                }
143            }
144
145            fn query(&self, mut i: i32) -> i32 {
146                let mut v = 0;
147                while i > 0 {
148                    v += self.fnodes[i as usize];
149                    i -= i & -i;
150                }
151
152                v
153            }
154        }
155
156        let mut fenwick = Bit::new(2*10_000 + 1 /* Shift 0 -> 1 */ + 1);
157
158        let mut rst = vec![];
159        for n in nums.iter().rev() {
160            rst.push(fenwick.query(n - 1 + 10_000 + 1));
161            fenwick.update(n + 10_000 + 1);
162        }
163
164        rst.reverse();
165
166        rst
167    }
168}
169
170/// 2179h Count Good Triplets in an Array
171struct Sol2179;
172
173impl Sol2179 {
174    /// 3 <= n <= 10^5
175    /// 0 <= N_i <= n-1
176    pub fn good_triplets(nums1: Vec<i32>, nums2: Vec<i32>) -> i64 {
177        #[derive(Debug)]
178        struct Fenwick {
179            nodes: Vec<i32>,
180        }
181
182        impl Fenwick {
183            fn new(size: usize) -> Self {
184                Fenwick {
185                    nodes: vec![0; size],
186                }
187            }
188
189            fn update(&mut self, mut i: usize, diff: i32) {
190                while (i as usize) < self.nodes.len() {
191                    self.nodes[i as usize] += diff;
192                    i += i & (!i + 1); // i & -i: 2's Compliment
193                }
194            }
195
196            fn query(&self, mut i: usize) -> i32 {
197                let mut v = 0;
198                while i > 0 {
199                    v += self.nodes[i as usize];
200                    i -= i & (!i + 1); // i & -i: 2's Compliment
201                }
202                v
203            }
204        }
205
206        let n = nums1.len() & nums2.len();
207
208        let mut map = vec![0; n];
209        for (i, &n) in nums2.iter().enumerate() {
210            map[n as usize] = i;
211        }
212        println!("-> {:?}", map);
213
214        let mut rmap = vec![0; n];
215        for (i, &n) in nums1.iter().enumerate() {
216            rmap[map[n as usize]] = i;
217        }
218        println!("-> {:?}", rmap);
219
220        let mut fenwick = Fenwick::new(n + 1);
221
222        let mut count = 0;
223        for v in 0..n {
224            let j = rmap[v];
225
226            let left = fenwick.query(j + 1);
227            fenwick.update(j + 1, 1);
228
229            let right = (n - 1 - j) - (v - left as usize);
230            count += right as i64 * left as i64;
231        }
232
233        println!(":: {}", count);
234
235        count
236    }
237}
238
239#[cfg(test)]
240mod tests;