Блог пользователя Lo_R_D

Автор Lo_R_D, история, 8 лет назад, По-русски

Добрый день.

Начну по порядку: вчера я два часа писал двумерное дерево отрезков с операцией суммы на сжатых координатах с хранением только ненулевых вершин. После этого еще два часа ушли на поиск ошибки. Потом начался раунд Aim Tech, и только после него я смог найти причину вердикта "Ошибка исполнения на тесте 17". Взгляните на следующий код и то как он работает.

Сначала я думал, что это срабатывает только для нулевой вершины, поэтому просто пропускал её. Но решить проблему с "Ошибкой исполнения" помогло лишь то, что перед использованием функции getNext() (а так же функций getLeft() и getRight()) я дополнительно вызываю их один раз без использования того, что они возвращают, потому что то что они могут вернуть после первого вызова — непредсказуемо. В частности: на Codeforces этот код вместо нуля выводит 24, у меня на компьютере — случайное большое число.

  • Проголосовать: нравится
  • -8
  • Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится +57 Проголосовать: не нравится

Потому что во время выполнения getNext() происходит добавление элемента в вектор. После этого у вектора может закончится память и он выделит больший кусок в другом месте. А метод-то был вызван по старому, уже неправильному адресу. Поэтому там может находится вообще что угодно.