Быстрый ввод-вывод
Две строки в начале main ускоряют cin и cout в несколько раз:
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
long long sum = 0;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
sum += x;
}
cout << sum << "\n";
return 0;
}5
10 20 30 40 50150И третье правило: переводите строку через "\n", а не через endl.
На олимпиадах это важно, когда во входных данных сотни тысяч чисел и больше: без этих строк решение с верным алгоритмом может не уложиться в ограничение по времени (Time Limit).
Что делают эти строки
ios::sync_with_stdio(false)— отключает синхронизацию потоков C++ (cin,cout) с вводом-выводом языка C (scanf,printf). По умолчанию они согласованы, чтобы их можно было смешивать, и за этоcinплатит скоростью.cin.tie(nullptr)— «отвязывает»cinотcout. По умолчанию перед каждым чтением изcinвыводcoutвыталкивается на экран — чтобы вопрос «Введите число:» был виден до ввода. При обработке файла это лишние действия.endlпосле каждой строки выталкивает вывод (сбрасывает буфер — память, где вывод копится перед отправкой на экран или в файл). Для миллиона строк это миллион медленных операций."\n"просто переводит строку, а вывод уходит большими порциями.
Обе строки ставятся в самом начале main, до первого ввода или вывода.
Подводные камни
После ios::sync_with_stdio(false) нельзя смешивать cin/cout со scanf/printf (и с puts, getchar). Порядок вывода перепутается, а ввод может прочитать не те данные. Выберите что-то одно.
- Интерактивные задачи — в них программа ведёт диалог с проверяющей программой: задаёт вопрос и ждёт ответа. Здесь после каждого вопроса вывод нужно вытолкнуть явно:
cout << x << endl;илиcout << x << "\n" << flush;. Иначе вопрос застрянет в буфере, а программа будет ждать ответа вечно. - Отладка в консоли. С
cin.tie(nullptr)приглашение к вводу может появиться позже, чем ожидается: вывод выталкивается не перед вводом, а когда буфер заполнится или программа закончится. Для задач с вводом из файла или проверяющей системы это не важно. cin.tie(0)иios_base::sync_with_stdio(false)— те же строки в другой записи, встречаются в чужих решениях.
А если всё равно медленно
Если в программе уже есть эти строки, а время всё равно превышено, дело почти всегда в алгоритме: проверьте, сколько действий он делает. Два вложенных цикла по 10⁵ — это 10¹⁰ операций, и никакой быстрый ввод их не спасёт.