`RandomizedCollection` is a data structure that contains a collection of numbers, possibly duplicates (i.e., a multiset). It should support inserting and removing specific elements and also reporting a random element. Implement the `RandomizedCollection` class: - `RandomizedCollection()` Initializes the empty `RandomizedCollection` object. - `bool insert(int val)` Inserts an item `val` into the multiset, even if the item is already present. Returns `true` if the item is **not** present, `false` otherwise. - `bool remove(int val)` Removes an item `val` from the multiset if present. Returns `true` if the item is present, `false` otherwise. Note that if `val` has multiple occurrences in the multiset, we only remove one of them. - `int getRandom()` Returns a random element from the current multiset of elements. The probability of each element being returned is **linearly related** to the number of the same values the multiset contains. You must implement the functions of the class such that each function works on **average** `O(1)` time complexity.
Example 1
Input: operations = ["RandomizedCollection","insert","getRandom","insert","remove","getRandom"], args = [[],[5],[],[5],[5],[]]
Output: [null,true,5,false,true,5]
Explanation: getRandom is queried only when every element equals 5, so it deterministically returns 5.
Example 2
Input: operations = ["RandomizedCollection","insert","insert","remove","insert"], args = [[],[1],[1],[2],[2]]
Output: [null,true,false,false,true]
Explanation: Second insert of 1 returns false; remove(2) returns false (absent); insert(2) returns true.
Example 3
Input: operations = ["RandomizedCollection","insert","remove","insert"], args = [[],[3],[3],[4]]
Output: [null,true,true,true]
Explanation: insert(3) returns true because 3 was absent. remove(3) returns true because it was present. insert(4) returns true because 4 is new.
Store all elements in a flat array for O(1) random access. A map from value to the set of positions where it lives lets insert/remove be O(1): to remove, swap the target with the last element and pop, fixing up the moved element's index in the map.
Run checks all cases above. Submit evaluates all test cases.