1struct Sol493 {}
5
6impl Sol493 {
7 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
67struct 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
120struct Sol315;
122
123impl Sol315 {
124 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 + 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
170struct Sol2179;
172
173impl Sol2179 {
174 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); }
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); }
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;