Lettura da file lenta (L33t H4xX0R)

Buongiorno. Ho giusto oggi tentato di risolvere il problema “L33t H4xX0R (password)”. Le assunzioni prevedono fino ad un massimo di 10 milioni di numeri presi da input, e fin qui, nulla di problematico. Il problema sorge quando questi numeri che devono essere letti sono di tipo Long Long. Nonostante io abbia risolto il problema totalizzando 100/100 punti, il tempo impiegato è troppo alto e non mi soddisfa, così tramite varie prove, ho scoperto che ben 3.2 di quei secondi utilizzati vengono impiegati dalla lettura da file. Ho provato infatti a sottomettere solamente questo codice, che legge da file e niente di più:

#include <fstream>
int N;
long long K;
long long x;
int main()
{
    std::ifstream in("input.txt");
    std::ofstream out("output.txt");

    in >> N >> K;
    for(int i=0; i<N; i++)
        in >> x;
    return 0;
}

Cosa sbaglio? Ho anche provato la corrispettiva lettura da file tramite fscanf, ma i risultati non cambiano. Invece, sostituendo i tipi di K e X da long long ad int, tutto avviene molto velocemente (anche se ovviamente leggerà numeri errati).

Non sbagli nulla, è normale. Esistono alcuni metodi come getchar_unlocked() e putchar_unlocked() che restituiscono un char preso da file in modo molto veloce, sta a te poi convertirlo.
Sottolineo che il time limit è pensato per i metodi che hai utilizzato precedentemente.

1 Mi Piace

Senza dover utilizzare i più scomodi get/putchar_unlocked(), è una buona pratica aggiungere nel tuo codice le righe in.tie(0); in.sync_with_stdio(0); per velocizzare l’input (a patto che tu non stia cercando di risolvere un problema interattivo in console, categoria che non penso sia presente qui sul cms).

1 Mi Piace

Innanzitutto grazie per le risposte.

Conoscevo il metodo “sync_with_stdio”, ma anche mettendolo non cambiava quasi nulla; buon a sapersi invece che esista anche il “tie”.

Proverò anche con getchar e putchar per vederne le differenze.

Se è davvero normale, allora mi rimane il dubbio: come hanno fatto le persone in classifica a metterci così pochi secondi? Ci sono due persone che in 0.7 secondi riescono a leggere da file ed eseguire l’algoritmo di risoluzione. Proverò a svolgere qualche test.

Per poter scalare la classifica devi essere skillato, non ci sono trucchi particolari ¯\(ツ)

6 Mi Piace

Beh. Se la lettura da file ci mette 4 volte tanto il tempo di qualcuno in classifica, allora qualche trucco particolare esiste. E comunque sono appena entrato in classifica :joy: