Во-первых; преобразовать его в другую форму. В частности, преобразуйте оригинал «увеличить каждый элемент от начала до конца» в «добавить V к каждому элементу от начала до конца», найдя перекрывающиеся диапазоны в оригинале и объединяя их.
Например, «добавить 1» к пунктам с 1 по 5, затем добавьте 1 к пунктам с 3 по 8 «станет», добавьте 1 к пунктам с 1 по 2, затем добавьте 2 к пунктам с 3 по 5, затем добавьте 1 к пунктам с 6 по 8.
Это означает, что к каждому элементу в массиве происходит прикосновение только один раз (и никогда не увеличивается несколько раз).
Second; Вы можете получить небольшую скорость в сортировке, введя «добавить ноль к элементам от начала до конца» (чтобы каждый элемент в массиве включался в один диапазон), отсортировав элементы в каждом диапазоне, а затем объединяя финальный предварительно отсортированные диапазоны. Здесь я думаю, что, объединяя диапазоны в порядке добавленной к ним стоимости и отслеживая «наивысшее значение на данный момент», иногда вы обнаружите, что добавленная к диапазону величина больше, чем «наивысшее значение на данный момент», и вы можете просто объединить / скопировать вместо слияния (и избегать ветвей «если значение1 меньше значения2»).
Конечно, это было бы значительно лучше, если вы знаете, что элементы были отсортированы до того, как вы что-то сделали, или если вы знаете, что массив был обнулен до того, как вы что-то сделали, так как это избавило бы от необходимости сортировать каждый диапазон перед объединением.
Примечание: если массив всегда инициализируется заранее равным нулю (а не просто инициализируется нулем один раз и затем периодически обновляется после этого); тогда «сложение» становится «установкой»; сортировки не будет (так как все значения в диапазоне будут одинаковыми), и вы всегда сможете объединять, а не объединять. Другими словами, вы можете сгенерировать целый новый массив (и не потрудиться заранее инициализировать массив нулями).