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

Автор okwedook, 5 лет назад, перевод, По-русски

Привет, Codeforces!

Прошу помощи с одной проблемой и объяснения, почему такое может происходить.

Предыстория

В общем я писал дерево отрезков сверху, чтобы добавлять число на отрезке 739C - Алёна и башни. После написания корректной программы я застрял на 4 тесте. После стресс теста (около 20000 тестов) я не смог найти ошибку.

После ещё двух часов я добавил перед кодом #define int long long. Это помогло мне пройти 4 тест, но я получил TLE 47. Как вы могли понять я не понимал, почему это помогло. И так как я пишу это — я не понимаю до сих пор. После небольшого расследования я понял, что единственная разница в одном методе void add(int d). Вот коды: Wrong Answer 4 и Accepted. Единственное изменение — void add(int d) теперь void add(long long d). Внутри функции все, что я делаю это:

void add(int d) {
    p += d;
    left += d;
    right += d;
}

Все переменные p, left and right типа long long, так что единственная разница в d. Это разница означает что long long += int работает не так, как я ожидал. Я всегда думал, что оно конвертирует int в long long и затем складывает. Кажется это не так.

Надеюсь кто-нибудь сможет мне помочь и объяснит, почему такое происходит. Еще хотел бы узнать, как вы справляетесь с проблемами типа переполнения на соревнованиях.

Заранее спасибо.

UPD: Проблема решена.

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

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

Difference is when you are trying to call add with parameter that doesn't fit in int. You have such calls in your code, check push method.