Что делать, если решение не проходит в контесте
Если решение работает локально, а в контесте падает, стоит поискать тест, на котором решение работает неправильно или медленно. Для этого можно запускать стресс-тесты (см. первый семинар в LMS) под санитайзерами.
Ниже перечислены основные причины, почему решение может работать медленно или потреблять много памяти
Медленный ввод-вывод
По умолчанию в C++ для iostream
включен режим совместимости с stdio
, который позволяет одновременно использовать оба интерфейса для ввода/вывода. В этом режиме производительность std::cin
и std::cout
понижается в несколько раз.
Поэтому если размер ввода/вывода имеет порядок от 100 000 чисел, вам нужно будет отключить этот режим. Делать это нужно до совершения каких-либо операций ввода-вывода, желательно первой же строкой в программе:
#include <iostream>
int main() {
std::ios_base::sync_with_stdio(false);
...
return 0;
}
Также обратите внимание на то, что std::cout
может работать слишком медленно, если вы выводите порядка 100 000 чисел или более, и при этом у std::cout
регулярно очищается буфер. Буфер очищается при каждом выводе std::endl
, так что в случае большого вывода лучше выводить "\n"
вместо std::endl
. Также буфер std::cout
очищается при каждом вводе через std::cin
— это связано с тем, что при пользовательском вводе-выводе через обычный std::cin
и std::cout
в консоли, необходимо показать пользователю последний вывод и очистить буфер перед тем как запрашивать очередной ввод. Эта проблема для задач с большим выводом решается с помощью вызова std::cin.tie(nullptr);
в самом начале программы. Выполнение всех этих рекомендаций приведёт к тому, что ввод-вывод при помощи потоков std::cin
и std::cout
будет работать не медленнее ввода-вывода через printf
и scanf
на задачах с большим вводом-выводом. Подробнее см. здесь.
Санитайзеры на маленьких тестах
На нескольких первых маленьких тестах в контесте решение запускается с санитайзером. Санитайзер увеличивает время работы и потреблении памяти программы, поэтому если в решении выделять статический массив максимального размера (например, int arr[100500]
), то решение может упасть с ML.