Aiuto per Fast I/O

Vorrei imparare a velocizzare i tempi di input e output, per ora conosco solo il fatto di aggiungere queste due righe:

ios_base::sync_with_stdio(false); 
cin.tie(NULL);

Conosco anche getc_unlocked() e getchar_unlocked() ma non riesco ad utilizzarli.
Mi potreste dire come funziona e qual è il modo più ottimale per velocizzare l’input e l’output oppure se conoscete un sito abbastanza chiaro dove poterli studiare

Per la maggior parte dei problemi quelle due righe sono più che sufficienti. Se ti serve un input ancora più veloce è molto probabile che la tua soluzione risulti lenta.
Se proprio vuoi usare la fast i/o devi utilizzare quelle due funzioni e fare il parsing carattere per carattere. Occhio che la versione unlocked puoi utilizzarla solo su linux.
Esempio per leggere e scrivere un intero:

inline static int scanInt(){
  register int n = 0;
  register int neg = 1;
  register char c = getchar_unlocked();
  if(c == '-')neg = -1;
  while(c <'0' || c > '9'){
    c = getchar_unlocked();
    if(c == '-')neg = -1;
  }
  while(c >= '0' && c <= '9'){
    n= (n << 3) + (n << 1) + c - '0';
    c=getchar_unlocked();
  }
  return n * neg;
}

inline static void writeInt(int v){
  static char buf[14];
  register int p=0;
  if(v==0){
    putchar_unlocked('0');
    return;
  }
  if(v < 0){
    putchar_unlocked('-');
    v = -v;
  }
  while(v){
    buf[p++] = v % 10;
    v /= 10;
  }
  while(p--){
    putchar_unlocked(buf[p] + '0');
  }
}

Occhio che queste due funzioni non le ho ancora testate, potrebbero essere non corrette :sweat_smile:

ah ok ecco perché non funzionavano perché non sono da linux grazie comunque

Per una lettura e scrittura ancora più veloce ti consiglio di usare il metodo di @MyK_00L :new_moon_with_face: https://github.com/myk00l/fastio

Mi potresti spiegare come funziona? Dato che gli ho dato uno sguardo ma penso di non aver be capito cosa devo fare

Allora devi includere la libreria

#include <unistd.h>

Poi devi dichiarare, a seconda se vuoi input o output

#define NBIN 8000000
#define NBOUT 20
//NBIN e NBOUT variano a seconda della dimensione dell'input e dell'output

unsigned char input[NBIN];
unsigned inputi;

unsigned char output[NBOUT];
unsigned outputi;

Poi scrivere nel main read(0,input,NBIN); ti metterà i primi NBIN caratteri dello standard input in input e scrivere write(1,output,outputi); ti metterà i primi outputi caratteri di output nello standard output, queste due funzioni le richiami all’inizio e alla fine, nel mezzo richiami le macro che sono definite (ovviamente metti solo quelle che ti servono) che ti convertono i caratteri salvati in input in numeri e viceversa.

Grazie ma penso che continuerò a usare il fast input quello più standard per comodità più che altro

Sì, ammetto che una persona debba proprio volerlo quel primo tempo per usare qualcosa del genere :sweat_smile:

2 Mi Piace

Farebbe molto comodo se è cosi pigro per non cercare una soluzione più ottimale però comunque utilizzare un minimo di fast input può essere sempre comodo :sweat_smile:

1 Mi Piace