BekzhanKassenov's blog

By BekzhanKassenov, 10 years ago, In Russian

Здравствуй, сообщество CodeForces!

Иногда бывает так, что удобнее было бы, если бы мы имели возможность обращаться к элементам массива, которые имеют отрицательный индекс. Распространенное решение — узнать минимальный возможный индекс (mn), максимальный возможный индекс (mx) и создать массив размером abs(mn) + mx + 1. В таком случае обращение к -1 элементу превращается в обращение к -1 + abs(mn) элементу. Этот подход имеет несколько недостатков: легко забыть дописать + abs(mn) при обращении к массиву, тяжелее дебагать, код становится громоздким.

Решая задачу с последнего контесте (383D - Антиматерия), я придумал похожее, но более удобное решение (в этой задаче нужно было обращаться к отрицательной сумме в динамике). Допустим, вам необходим массив, индексы которого лежат в промежутке [mn; mx] и mn < 0. Заведем массив mem[mx + abs(mn) + 1] и int* dp. В начале программы проинициализируем dp = mem + abs(mn). Готово! Можно обращаться к dp по отрицательным индексам в промежутке [mn, 0).

Пример использования 5771473.

А теперь вопросы:

1) Бояниста ли идея? Существуют ли другие пути обратиться к отрицательному индексу массива?

2) Есть ли подводные камни у этого метода? Чем это может быть плохо?

На этом все, спасибо за внимание.

  • Vote: I like it
  • +89
  • Vote: I do not like it