Вы можете значительно сократить время выполнения, взяв ввод с помощью fread()
или fread_unlocked()
(если ваша программа однопоточная).Блокировка / разблокировка входного потока только один раз занимает незначительное время, поэтому игнорируйте это.
Вот код:
#include <iostream>
int maxio=1000000;
char buf[maxio], *s = buf + maxio;
inline char getc1(void)
{
if(s >= buf + maxio) { fread_unlocked(buf,sizeof(char),maxio,stdin); s = buf; }
return *(s++);
}
inline int input()
{
char t = getc1();
int n=1,res=0;
while(t!='-' && !isdigit(t)) t=getc1(); if(t=='-')
{
n=-1; t=getc1();
}
while(isdigit(t))
{
res = 10*res + (t&15);
t=getc1();
}
return res*n;
}
Это реализовано в C++
.В C
вам не нужно включать iostream
, функция isdigit()
неявно доступна.
Вы можете принять ввод как поток символов, вызвав getc1()
, и получить целочисленный ввод, вызвавinput()
.
Вся идея использования fread()
заключается в том, чтобы сразу брать большие блоки ввода.Вызов scanf()/printf()
многократно отнимает драгоценное время при блокировке и разблокировке потоков, что полностью избыточно в однопоточной программе.
Также убедитесь, что значение maxio
таково, что весь ввод может быть приняттолько в несколько «круговых поездок» (в данном случае, в идеале, один).Настройте его по мере необходимости.Эта техника очень эффективна в соревнованиях по программированию, чтобы получить преимущество над оппонентом по времени выполнения.
Надеюсь, это поможет!