У меня есть входные данные, состоящие из рангов в каком-то соревновании (скажем, марафоне) со значениями в диапазоне [0, N)
. Существует несколько подконкурсов (например, основанных на возрасте, поле и т. д.), которые интересны только для подмножества team
и не подходят для другого подмножества not_eligible
.
Я ищу эффективный алгоритм (желательно написанный в терминах стандартной библиотеки), который будет обновлять ранги. Пример:
auto team = std::vector<int>{ 1, 2, 9, 13 };
auto not_eligible = std::vector<int>{ 8, 10, 12 };
std::vector<int> result;
// some algorithm
assert(result == std::vector<int>{ 1, 2, 8, 10 });
Поскольку только 1 участник ниже № 9 (т.е. № 8) не имел права, рейтинг № 9 уменьшается на 1, а также потому, что до № 13 было 3 не соответствующих требованиям финишера (т. е. № 8, № 10 и № 12). , этот рейтинг обновляется на 3 с № 13 до № 10 для этого конкретного подконкурса.
Примечание 8 и 10 являются частью result
, но не потому, что они были объединены из non_eligible
, а потому, что их ранги были взяты 9 и 13 из team
.
Как я могу добиться вышеперечисленного, используя комбинацию стандартных алгоритмов? Я надеялся, что смогу сделать это со сложностью O(N + M)
для входных диапазонов длины N
и M
(например, через 5-ногий std::transform
).
ОБНОВЛЕНИЕ: меня также интересует обратный алгоритм: учитывая рейтинг подконкурса, как обновить рейтинги претендентов в подконкурсе при добавлении ранее не подходящих участников?
8, 10
находится внутриnot_eligible
. Вы можете изменитьnot_eligible
на что-то вроде{5, 11, 12}
. - person Jarod42   schedule 07.02.2014