FloatingMedian
SRM 310 · 2006-07-06 · by misof
Problem Statement
In meteorology, a common statistical tool is the median of a given set of measurements. (You can find a definition of the median in the Notes section.)
You are writing software for a device that measures temperature once a second. The device has a small digital display. At any moment, the display has to show the median of temperatures measured in the last K seconds.
Before you upload your software into the device, you would like to test it on a computer.
Instead of measuring temperatures, we will use a random number generator (RNG)
to generate fake temperatures.
Given three
- t0 = seed
- tk+1 = (tk * mul + add) mod 65536
In addition to the parameters of the RNG, you
will be given two
Consider the sequence containing the first N temperatures generated by the RNG (i.e., values t0 to tN-1). This sequence has N-K+1 contiguous subsequences of length K. For each such subsequence compute its median.
Your method will be given the numbers seed, mul, add, N,
and K. Compute all the medians as described above, and return a
Notes
- Given K numbers, their median is the ((K+1)/2)-th smallest of them, rounding down for even K, and indexing from 1. For example, the median of (1, 2, 6, 5, 4, 3) is 3, and the median of (11, 13, 12, 14, 15) is 13.
Constraints
- seed, mul, and add are between 0 and 65535, inclusive.
- N is between 1 and 250,000, inclusive.
- K is between 1 and 5,000, inclusive.
- N is greater than or equal to K.
3 1 1 10 3 Returns: 60
The generated temperatures are: 3, 4, 5, 6, 7, 8, 9, 10, 11, and 12. The length-3 contiguous subsequences are (3, 4, 5), (4, 5, 6), ..., and (10, 11, 12). Their medians are 4, 5, ..., 11. The sum of these medians is 4+5+...+11 = 60.
10 0 13 5 2 Returns: 49
This time the generated temperatures are 10, 13, 13, 13, and 13. The medians you should compute are 10, 13, 13, and 13.
10 0 7 5 2 Returns: 28
4123 2341 1231 7 3 Returns: 102186
Generated temperatures: 4123, 19382, 23581, 23040, 1743, 18362, 60593.
47 5621 1 125000 1700 Returns: 4040137193
A quite large random test case.
32321 46543 32552 17 17 Returns: 25569
Watch out for integer overflow when generating the temperatures.
Submissions are judged against all 59 archived test cases, of which 6 are shown here. Case numbers match the judge’s.
Language: C++17 · define a public class FloatingMedian with a public method long long sumOfMedians(int seed, int mul, int add, int N, int K) · 59 test cases · 2 s / 256 MB per case