Увеличить скорость ввода-вывода в cpp для конкурентного кодирования

#c #performance #input #io

#c #Производительность #ввод #io

Вопрос:

Я новичок в конкурентном программировании. Я решал этот вопрос (https://www.codechef.com/problems/SUMTRIAN ) и упоминается, что этот вопрос требует быстрого ввода-вывода. Я тестировал свою функцию f на время, и это заняло 1 микросекунду, а ввод-вывод занял 44505 микросекунд. Следовательно, я считаю, что ввод-вывод является узким местом

Мое решение заключается в следующем

 int fastscan()
{
    int x{};
    bool neg = false;
    register int c;
    x = 0;
    c = char();
    // for(;(c<48||c>57);c=char());
    if (c == '-') {
        neg = true;
        c = char();
    }
    for (; (c > 47 amp;amp; c < 58); c = char())
        x = (x << 1)   (x << 3)   c - 48;
    if (neg)
        x *= -1;
    return x;
}

long long unsigned int f(array<int, 10005>amp; arr, long long int max, long long int cur, long long int n)
{
    if (cur   n >= max)
        return arr[n];
    long long int count{ 0 }, count1{ 0 };
    count = f(arr, max, cur   1, n   cur);
    count1 = f(arr, max, cur   1, n   cur   1);
    count = count > count1 ? count : count1;
    return count   arr[n];
}

int main(int argc, char const* argv[])
{
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    long long int t{};
    std::cin >> t;
    int n{};
    array<int, 10005> arr;
    while (t--) {
        n = fastscan();
        int temp = n * (n   1) / 2;
        int max = temp;
        while (temp--) {
            arr[max - temp - 1] = fastscan();
        }
        return 0;
        long long int c{};
        c = f(arr, max, 1, 0);
        std::cout << c << 'n';
    }
    return 0;
}
  

Но при отправке он показывает превышение временного предела. одно из принятых решений заключается в следующем

 #define mod 1000000007
#define ll long long
#define sc(x) scanf("%d",amp;x)
#define scll(x) scanf("%lld",amp;x)
#define pr(x) printf("%dn",x)
#define prll(x) printf("%lldn",x)
#define gc getchar_unlocked
#define pc putchar_unlocked    
inline int scan()
    {
        register int c = gc();
        int x = 0;
        for (; (c < 48 || c > 57); c = gc())
            ;
        for (; (c > 47 amp;amp; c < 58); c = gc()) {
            x = (x << 1)   (x << 3)   c - 48;
        }
        return x;
    }
    
    inline void print(int a)
    {
        char snum[20];
        int i = 0;
        do {
            snum[i  ] = a % 10   48;
            a = a / 10;
        } while (a != 0);
        i = i - 1;
        while (i >= 0)
            pc(snum[i--]);
        pc('n');
    }
    int a[100][100];
    int sum(int n)
    {
        int i, j;
        for (i = 0; i < n; i  ) {
            for (j = 0; j <= i; j  ) {
                a[i][j] = scan();
            }
        }
        for (i = 1; i < n; i  ) {
            for (j = 0; j <= i; j  ) {
                if (j == 0)
                    a[i][j]  = a[i - 1][j];
                else if (j == i)
                    a[i][j]  = a[i - 1][j - 1];
                else {
                    a[i][j]  = max(a[i - 1][j], a[i - 1][j - 1]);
                }
            }
        }
        int mm = 0;
        for (j = 0; j < n; j  ) {
            if (a[n - 1][j] > mm)
                mm = a[n - 1][j];
        }
    
        return mm;
    }
    
    int main()
    {
        int t, n;
        t = scan();
        while (t--) {
    
            n = scan();
            print(sum(n));
        }
    }
  

время, измеренное на моей машине для моего кода, меньше принятого кода …. тем не менее, выполнение принятого кода на codechef занимает 0,01 секунды, а моего — 3,01.
может кто-нибудь, пожалуйста, помочь??

Комментарии:

1. fastscan всегда возвращает одно и то же значение и return 0 заставляет ваш внешний цикл while выполняться только один раз?

2. Учитывая очевидную алгоритмическую разницу между вашим кодом и принятым кодом (просто сравните вашу f функцию с принятой sum функцией), почему вы думаете, что проблема в скорости ввода-вывода? Сайты конкурентного кодирования, как правило, предназначены для выбора наилучшего алгоритма, а не для максимизации скорости ввода-вывода.

3. @AlanBirtles Как бы это ни было ужасно, я предполагаю, что char() на самом деле это макрос для чтения символов (как gc() в другом коде).

4. Если вам нужно настроить ввод-вывод, чтобы сделать код достаточно быстрым, почти всегда есть алгоритм, который работает еще быстрее без этого.

5. Довольно мило, что принятое решение использует оба register и inline , ни одно из которых не влияло на время выполнения буквально десятилетиями. Это чисто карго-культовое программирование.