Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 17.11.2022
Сообщений: 89

Ускорить код

21.03.2023, 21:35. Показов 3890. Ответов 60

Студворк — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой. При выполнении теста, превышается время выполнения кода в 2 с. Обращаюсь за помощью и советом как ускорить код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <cstring>
int main()
{
    int t,n,q,l,r,k, sum = 0;
    std::cin >>t;
    
    for(int i = 0; i < t; i++){
        std::cin >>n>>q;
        int mas[n];
        int mas2[n];
        for(int j = 0; j < n; j++){
            std::cin>>mas[j];
        }
        for(int j = 0; j < q; j++){
            memcpy(mas2, mas, sizeof(mas2));
            std::cin>>l>>r>>k;
            for(int a = l - 1;a < r; a++){
                mas2[a] = k;
            }
            for(int a = 0; a < n; a++){
            sum+= mas2[a];
            }
            
            if(sum%2 != 0){
                std::cout << "YES" << std::endl;
                sum = 0;
            
            }
            else{
                std::cout << "NO" << std::endl;
                sum = 0;
            }
            
            }
        }
        
    
    
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2023, 21:35
Ответы с готовыми решениями:

Как ускорить код?
Есть код : #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;memory.h&gt; #include &lt;iostream&gt; using namespace std; const int N =...

Нужно ускорить код
Мне нужно написать программу, для преобразования коэффициентов системы и столбца свободных членов к виду, необходимому для импорта в...

Как ускорить код?
Решаю задачу на нахождение суммы в подматрице через префиксы. Написал код, но не проходит по времени. Как можно ускорить? Сначала...

60
0 / 0 / 0
Регистрация: 17.11.2022
Сообщений: 89
21.03.2023, 23:35  [ТС]
Студворк — интернет-сервис помощи студентам
есть какие то варианты решения?
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
21.03.2023, 23:36
bmouse, попробуйте
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
int main()
{
    int t,n,q,l,r,k,i,j,a;
    unsigned long long int sum;
    std::vector<int> mas;
    
    std::cin >> t;
    for( i = 0; i < t; ++i ){
        std::cin >>n>>q;
        mas.resize(n);
        
        for( j = 0; j < n; ++j )
            std::cin>>mas[j];
 
        for( j = 0; j < q; ++j ){
            std::cin>>l>>r>>k;
            sum = 0;
            for( a = 0; a < n; a++ )
                sum += ( ( a >= l-1 && a <= r-1 ) ? k : mas[a] );
                
            std::cout << ( sum%2 ? "YES" : "NO" ) << std::endl;
        }
    }
    return 0;
}
0
 Аватар для Наталья8
639 / 397 / 68
Регистрация: 09.03.2016
Сообщений: 4,365
21.03.2023, 23:37


calloc - медленно.
Т.Е. не надо массивы инициализировать нулями...
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
21.03.2023, 23:38
Наталья8, это к чему вообще?
0
0 / 0 / 0
Регистрация: 17.11.2022
Сообщений: 89
21.03.2023, 23:40  [ТС]
не проходит, не понимаю, на сколько нужно его еще оптимизировать чтобы он прошел, без вашей помощи я бы вообще ничего не слепил бы
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
21.03.2023, 23:43
bmouse, на 99% процентов тогда говорю вам, что дело не в скорости выполнения кода. Зацикливание или переполнение переменных - самая вероятная причина такой проблемы.
0
0 / 0 / 0
Регистрация: 17.11.2022
Сообщений: 89
21.03.2023, 23:46  [ТС]
можете подробнее рассказать об этом, и как это выявить? Попробую далее сам что то наковырять
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.03.2023, 23:48
А как время измеряется, если ввод ручной?
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
21.03.2023, 23:53
О, "гениальная" идея пришла У вас N ограничено сверху числом 210 по условию ( 1≤n≤2⋅105 ), тогда ресайз вектора вообще не нужен. Сразу выделяем максимум, которого точно хватит, и никаких ресайзов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
 
#define MAX_COUNT 210
 
int main()
{
    int t,n,q,l,r,k,i,j,a;
    unsigned long long int sum;
    std::vector<int> mas(MAX_COUNT);
    
    std::cin >> t;
    for( i = 0; i < t; ++i ){
        std::cin >>n>>q;
        //mas.resize(n);
        
        for( j = 0; j < n; ++j )
            std::cin>>mas[j];
 
        for( j = 0; j < q; ++j ){
            std::cin>>l>>r>>k;
            sum = 0;
            for( a = 0; a < n; a++ )
                sum += ( ( a >= l-1 && a <= r-1 ) ? k : mas[a] );
                
            std::cout << ( sum%2 ? "YES" : "NO" ) << std::endl;
        }
    }
    return 0;
}
Добавлено через 1 минуту
nmcf, все условие сразу во входной поток закидывают, засекают время, ждут последнего ответа проги, останавливают таймер.

Добавлено через 1 минуту
Цитата Сообщение от Evgen173 Посмотреть сообщение
Сразу выделяем максимум, которого точно хватит, и никаких ресайзов.
Да и вообще, смысл вектора тут пропадает, можно к голому массиву вернуться. Делать я этого не буду, не может в таких вещах проблема быть, когда тест за 2с не проходится.
0
 Аватар для Наталья8
639 / 397 / 68
Регистрация: 09.03.2016
Сообщений: 4,365
22.03.2023, 00:19
Цитата Сообщение от Evgen173 Посмотреть сообщение
это к чему вообще?
К тому, что vector ни при чём...

А помочь не могу. Ибо не вьехал, а чё это и зачем..
Ресайз- это мееееедленно.

Добавлено через 12 минут
Время меряют...


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
   #include <windows.h>
                 #include <ctime>
                #include <ratio>
              #include <chrono>
//using namespace std;
 
/*
 
https://www.cplusplus.com/reference/chrono/high_resolution_clock/now/
https://stackoverflow.com/questions/49090366/how-to-convert-stdchronohigh-resolution-clocknow-to-milliseconds-micros
*/
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std::chrono;
    while (1){
        high_resolution_clock::time_point t1 = high_resolution_clock::now();
                
for (int i = 0; i < 10000; ++i) std::cout << "*";
        std::cout << std::endl;
 
        high_resolution_clock::time_point t2 = high_resolution_clock::now();
 
        duration<double>time_span = duration_cast<duration<double>>(t2 - t1);
 
        std::cout << "It took me: " << time_span.count() << " seconds.";
        std::cout << std::endl;
    std::cout << "printing out 10000 stars...\n"; Sleep(500);
             }
    return 0;
}
1
 Аватар для Наталья8
639 / 397 / 68
Регистрация: 09.03.2016
Сообщений: 4,365
22.03.2023, 00:23
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
22.03.2023, 02:20
Типа такого?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <vector>
#include <cstring>
 
int main()
{
    std::ios::sync_with_stdio(false); // disable synchronization between C and C++ standard streams
    int t, n, q, l, r, k, sum = 0;
    std::cin >> t;
 
    for (int i = 0; i < t; i++) {
        std::cin >> n >> q;
        std::vector<int> mas(n);
        std::vector<int> prefixSum(n);
 
        for (int j = 0; j < n; j++) {
            std::cin >> mas[j];
        }
 
        prefixSum[0] = mas[0];
        for (int j = 1; j < n; j++) {
            prefixSum[j] = prefixSum[j - 1] + mas[j];
        }
 
        for (int j = 0; j < q; j++) {
            std::cin >> l >> r >> k;
            sum = prefixSum[r - 1] - (l > 1 ? prefixSum[l - 2] : 0);
            sum += (r - l + 1) * k;
 
            if (sum % 2 != 0) {
                std::cout << "YES\n";
            }
            else {
                std::cout << "NO\n";
            }
        }
    }
    return 0;
}
0
фрилансер
 Аватар для Алексей1153
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,409
22.03.2023, 05:16
Цитата Сообщение от OSPFv3 Посмотреть сообщение
std::vector<int> mas(n);
        std::vector<int> prefixSum(n);
тебя динамическая память будет выделяться и освобождаться на каждой итерации цикла. Если же векторы вынести до цикла, то память будет реаллоцироваться реже (если размер данных меньше или равен при очередном ресайзе)
1
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,356
22.03.2023, 09:14
Цитата Сообщение от Evgen173 Посмотреть сообщение
У вас N ограничено сверху числом 210 по условию ( 1≤n≤2⋅105 )
1 <= n <= 2 * 100 000, пора бы уж привыкнуть, что 105 это 10 в пятой степени.
0
 Аватар для Pphantom
2491 / 1641 / 746
Регистрация: 17.03.2022
Сообщений: 5,362
22.03.2023, 11:48
Цитата Сообщение от alexu_007 Посмотреть сообщение
1 <= n <= 2 * 100 000, пора бы уж привыкнуть, что 105 это 10 в пятой степени.
Смысл замечания это не сильно меняет: память в любом случае выделяется в куче, а потребный один мегабайт в нынешних условиях - не то, что нужно старательно экономить.
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
22.03.2023, 11:49
Алексей1153,
Тогда вот. А вообще лучше ещё использовать библиотеку fmt, которая интегрирована в C++23(т.е. latest version)
https://ibb.co/1MgpDTr
https://github.com/fmtlib/fmt#benchmarks
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <cstdio>
#include <cstring>
 
const int MAXN = 1e5 + 5;
 
int n, q, t, l, r, k, sum, a[MAXN], prefixSum[MAXN];
 
inline int read() {
    int x = 0;
    char c = getchar();
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') {
        x = (x << 3) + (x << 1) + (c ^ 48);
        c = getchar();
    }
    return x;
}
 
inline void write(int x) {
    static char buf[20];
    int p = 0;
    if (!x) buf[++p] = '0';
    while (x) {
        buf[++p] = x % 10 + '0';
        x /= 10;
    }
    while (p) putchar(buf[p--]);
    putchar('\n');
}
 
int main() {
    t = read();
    while (t--) {
        n = read();
        q = read();
        memset(prefixSum, 0, sizeof(prefixSum));
        for (int i = 0; i < n; i++) {
            a[i] = read();
            prefixSum[i] = a[i] + (i > 0 ? prefixSum[i - 1] : 0);
        }
        while (q--) {
            l = read();
            r = read();
            k = read();
            sum = prefixSum[r - 1] - (l > 1 ? prefixSum[l - 2] : 0);
            sum += (r - l + 1) * k;
            write(sum & 1);
        }
    }
    return 0;
}
Я сначала думал юзать scanf && printf, но выбрал более быстрое...

1. Использую быстрые методы ввода/вывода
Использование функций `scanf` и `printf` из библиотеки `cstdio` может быть оптимизировано за счет использования более быстрых методов ввода/вывода, таких как `fgets` и `puts`. Эти методы могут быть использованы для чтения и записи строк, которые затем могут быть преобразованы в требуемый тип данных.

2. Избегаю использования векторов
Использования векторов можно избежать, чтобы уменьшить накладные расходы на динамическое выделение и освобождение памяти. Вместо этого можно использовать массивы, которые имеют фиксированный размер и к которым быстрее получить доступ.

3. Использую побитовый оператор И для деления
Оператор `%`, используемый для деления, может быть заменен побитовым оператором И `&`, когда делитель равен степени 2. Такая оптимизация может значительно повысить производительность кода.
0
фрилансер
 Аватар для Алексей1153
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,409
22.03.2023, 11:55
1 - сомнительная выгода. Лучше тогда форматировать в std::ostringstream, а после всех циклов разом бабахнуть в консоль
2 - вектор тут ни при чём, бессмысленный пункт
3 - оптимизатор сам поработает с % и сделает лучше или так же, чем будешь вручную крохи ловить с битовыми операциями

а вот на мыслю интересную навёл - у них там компилятор с -O4 или хотя бы -O3 то запускается ?
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
22.03.2023, 12:09
Цитата Сообщение от Алексей1153 Посмотреть сообщение
2 - вектор тут ни при чём, бессмысленный пункт
Вектор аллоцирует память, что будет занимать время, массив же уже есть в секции .data или .bss(зависит от компилятора)
Цитата Сообщение от Алексей1153 Посмотреть сообщение
1 - сомнительная выгода. Лучше тогда форматировать в std::ostringstream, а после всех циклов разом бабахнуть в консоль
Я же скинул бенчмарки...
Цитата Сообщение от Алексей1153 Посмотреть сообщение
3 - оптимизатор сам поработает с % и сделает лучше или так же, чем будешь вручную крохи ловить с битовыми операциями
не обработает. Компилятор полагается на SSA представление кода и трехадресный код, т.е. автоматическая оптимизация. Там нету шаблонов для проработки этого.

В противном случае тут будет div или idiv
https://ibb.co/hYG9n1b

Но компилятор никак не заменит div или idiv на and. Это разные операции по семантики

Цитата Сообщение от Алексей1153 Посмотреть сообщение
а вот на мыслю интересную навёл - у них там компилятор с -O4 или хотя бы -O3 то запускается ?
Если ты про clang(надеюсь про него, так как сейчас самый лучший оптимизатор), то там нету -O4, это просто другое наименование: clang-16: warning: -O4 is equivalent to -O3 [-Wdeprecated]
0
фрилансер
 Аватар для Алексей1153
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,409
22.03.2023, 12:46
Цитата Сообщение от OSPFv3 Посмотреть сообщение
Вектор аллоцирует память, что будет занимать время
это произойдёт один раз перед циклом (при использовании reserve), поэтому на времени не скажется

всё остальное - мелочи

Добавлено через 57 секунд
разве что ещё сам алгоритм распараллелить остаётся, но это тоже нужно тестить, поможет ли
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
22.03.2023, 12:49
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это произойдёт один раз перед циклом (при использовании reserve), поэтому на времени не скажется
всё остальное - мелочи
Тут речь идет о о миллисекундах, так что "мелочи" неприемлемы. Не знаю о каком reserve ты говоришь, при аллоцировании вектора, когда я крэкал программу там использовался malloc с оберткой сверху...
Цитата Сообщение от Алексей1153 Посмотреть сообщение
разве что ещё сам алгоритм распараллелить остаётся, но это тоже нужно тестить, поможет ли
Сомневаюсь, что тут это будет иметь смысл. Я думаю, что мой вариант более чем подходит, но в любом случае надо ждать TC'а

Всё я тебя понял, ты об info виртуальной секции говоришь
https://ibb.co/n1Vcdh3
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.03.2023, 12:49

Гипотеза Коллатца(ускорить код)
Существует вот такая вот гипотеза Коллатца(https://ru.wikipedia.org/wiki/Гипотеза_Коллатца), которую я отобразил в следующей функции: int...

Нужно ускорить код. Буду очень благодарен
Условие задачи: Вводиться число n, затем вводятся n чисел. Нужно с последней введенной цифры до первой вывести число, и сколько раз оно...

Как можно ускорить код? Решение выдаёт верное, но по времени не проходит
Как можно ускорить код? Решение выдаёт верное, но по времени не проходит ограничение по времени на тест 2 секунды ограничение по...

Ускорить программу на C++
Требуется ускорить эту программу тесты 7 6 3 4 36 2 2 1 1 2 2 2 1 2 4 Программа: #include...

Ускорить программу c++
#include &lt;iostream&gt; using namespace std; int main() { long long n, i=1, sum=0; cin &gt;&gt; n; while (i &lt;=n) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru