Здравствуй, сообщество CodeForces!
Иногда бывает так, что удобнее было бы, если бы мы имели возможность обращаться к элементам массива, которые имеют отрицательный индекс. Распространенное решение — узнать минимальный возможный индекс (mn
), максимальный возможный индекс (mx
) и создать массив размером abs(mn) + mx + 1
. В таком случае обращение к -1
элементу превращается в обращение к -1 + abs(mn)
элементу. Этот подход имеет несколько недостатков: легко забыть дописать + abs(mn)
при обращении к массиву, тяжелее дебагать, код становится громоздким.
Решая задачу с последнего контесте (383D - Antimatter), я придумал похожее, но более удобное решение (в этой задаче нужно было обращаться к отрицательной сумме в динамике). Допустим, вам необходим массив, индексы которого лежат в промежутке [mn; mx]
и mn < 0
. Заведем массив mem[mx + abs(mn) + 1]
и int* dp
. В начале программы проинициализируем dp = mem + abs(mn)
. Готово! Можно обращаться к dp
по отрицательным индексам в промежутке [mn, 0)
.
Пример использования 5771473.
А теперь вопросы:
1) Бояниста ли идея? Существуют ли другие пути обратиться к отрицательному индексу массива?
2) Есть ли подводные камни у этого метода? Чем это может быть плохо?
На этом все, спасибо за внимание.