В некоторых задачах бывает очень много входных данных, поэтому тут я соберу ценные советы как ускорить ввод и вывод
1) ипользуйте \('\n'\) вместо \(endl\)
\(endl\) не только переносит строку но и сбрасывает буфер вывода, что замедляет процесс.
Но будте осторожны в интерактивных задачах, так как раз таки и нужно сбрасывать буфер
2)
ios_base::sync_with_stdio(false);
cout.tie(0);
cin.tie(0);
первая строчка отключает синхронизацию потока ввода для scanf и cin
Если вы используете их вместе - это не для вас
Это ускоряет ввод и вывод, так как не приходтся проверять, а не изменилось ли ничего с последнего вывода вывода
Вторая строчка вообще не особо нужна, но я ее пишу на удачу
Третья строчка отключает сброс буфера при вводе
А что если нужно прямо очень быстро читать???
Ну, есть вот такая вот вещь: ТЫК
Это библиотека Сергея Копелиовича которая умеет много всего, но это все еще не самый быстрый способ
Давайте воспользуемся тем, что мы пишем конкретный ввод под конкретную задачу, значит - мы знаем формат входных данных. Таким образом можно избавиться от большого количества ненужных проверок.
Как пример: для решения задачи о вводе числа N и последующем вводе N неотрицательных чисел типа int вполне подойдет и вот такая реализация:
const int _size = 1 << 13;
unsigned char buff[_size | 1];
short int pos = _size;
char c;
inline void getBuff() {
pos = fread(buff, 1, _size, stdin);
buff[pos] = '\n';
pos = 0;
}
inline void getChar() {
if (pos == _size)
getBuff();
c = buff[pos];
++pos;
}
inline int getInt() {
getChar();
int ans = 0;
while (c != '\n' && c != ' ') {
ans = ans * 10 + c - '0';
getChar();
}
return ans;
}
Согласитесь, не такая страшная реализация.
Для сравнения давайте посмотрим на эти посылки по этой задаче:
без всего: 514мс !!!
с тремя магическими строчками: 78мс
optimization.h: 46мс
простая реализация: 46мс
Ну а дальше вам придется просто мне поверить:
для ввода \(10^7\) целых неотрицательных чисел int необходимо:
без всего: ~20500мс
3 строчки: ~2400мс
optimization.h: ~740мс
эта реализация: ~480мс
Таким образом мы видим, что писать ввод под конкретную задачу куда продуктивнее, чем пользоваться обобщенными методами ввода
Аналогично можно написать и вывод.
Думаю вы уловили логику - пользуясь тем, что вы знаете что вы хотите считать/вывести уменьшать количество проверок и вообще ненужных действий