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

Ускорить код

21.03.2023, 21:35. Показов 3894. Ответов 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
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
22.03.2023, 12:52
Студворк — интернет-сервис помощи студентам
OSPFv3, у вектора есть метод reserve
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
22.03.2023, 12:57
Цитата Сообщение от Алексей1153 Посмотреть сообщение
OSPFv3, у вектора есть метод reserve
А ёк макарёк, я думал, что ты о низком уровне, а так да...
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
22.03.2023, 14:52
Цитата Сообщение от OSPFv3 Посмотреть сообщение
Вектор аллоцирует память, что будет занимать время
Цитата Сообщение от OSPFv3 Посмотреть сообщение
Тут речь идет о о миллисекундах
Цитата Сообщение от OSPFv3 Посмотреть сообщение
А ёк макарёк, я думал, что ты о низком уровне, а так да...
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
22.03.2023, 15:10
SmallEvil, так и что ты этим хотел сказать?)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
22.03.2023, 15:23
Цитата Сообщение от OSPFv3 Посмотреть сообщение
так и что ты этим хотел сказать?)
Что вы не там ищите пути оптимизации, в глобальном обзоре, это я не про текущую задачу.
Текущая решается без всяких страданий над ассемблеровскими вставками и размышлениями о том как компилятор и процессор будут генерировать и исполнять ваш код.

Но желания разбирать простыню ТЗ от автора, нет никакого желания.

Добавлено через 2 минуты
А еще, что вектор можно применить и даже нужно, так что не будет никакой нагрузки.
А выделить на стеке массив N-фигового размера - это тру вей ? да ? )
0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
22.03.2023, 15:24
Цитата Сообщение от SmallEvil Посмотреть сообщение
Что вы не там ищите пути оптимизации, в глобальном обзоре, это я не про текущую задачу.
Текущая решается без всяких страданий над ассемблеровскими вставками и размышлениями о том как компилятор и процессор будут генерировать и исполнять ваш код.
Про ассмблерные вставки я даже не упоминал, так как в нынешнем C++ в VS22 на 64 они реализуемы только линковкой .asm файла и компилятор их будет криво обрабатывать.
Цитата Сообщение от SmallEvil Посмотреть сообщение
размышлениями о том как компилятор и процессор будут генерировать и исполнять ваш код.
Я об этом постоянно размышляю, так как это самое интересное, а не тупая писанина кода.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
22.03.2023, 15:40
Цитата Сообщение от OSPFv3 Посмотреть сообщение
Я об этом постоянно размышляю, так как это самое интересное
Тогда очевидно что этот раздел не для вас.

Цитата Сообщение от OSPFv3 Посмотреть сообщение
а не тупая писанина кода.
Это вообще что должно означать ?


Добавлено через 1 минуту
OSPFv3, возьмите opencv или boost::asio и поразмышляйте о сгенерированном коде.
Надеюсь вы поняли к чему я веду.
Если будете думать как ассемблерный кодер, то дальше калькулятора ничего не напишите.
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
22.03.2023, 21:15
Если 104 это 10^4, а 105 это 10^5, то при максимальных значениях потребуется 10^9 выполнений циклов вычислений. Это ващ. реально за 2 секунды?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
22.03.2023, 21:58
Цитата Сообщение от alexu_007 Посмотреть сообщение
Если 104 это 10^4, а 105 это 10^5, то при максимальных значениях потребуется 10^9 выполнений циклов вычислений. Это ващ. реально за 2 секунды?
Это в принципе неважно.
Такие курсы и тз роспрофкомнадзора по созданию универсальных солдатоврабов(зомбаков).
По другому все это воспринимать невозможно.

Добавлено через 1 минуту
Даже если это проявление просто тех кто не справляется (что заметно по ТЗ что это не так, что теории там нету), то все равно это просто безумие чистой воды.
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
22.03.2023, 23:26
C 104-105 там наверняка переполнение переменных
0
 Аватар для Наталья8
640 / 398 / 68
Регистрация: 09.03.2016
Сообщений: 4,396
23.03.2023, 01:34
Чё вообще делает ваш тест?
Тестит?

Добавлено через 1 минуту
Нельзя было поменять переменные?
0
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
23.03.2023, 09:42
bmouse, можешь сгенерить мне файл с контентом, примерно равным по объёму из теста? Я попробую поковырять

Добавлено через 32 минуты
bmouse, в общем, опробуй. Особо оптимизацией не занимался. Думаю, ещё есть, где развернуться

https://onlinegdb.com/L6f2_02hX

пояснения к настройкам:
//#define useInputGenerator//Раскомментировать для генерации файла ввода
#define useAsserts //дебажные ассерты. Закомментировать при измерении скорости
#define useDebugOutput //дебажный вывод. Закомментировать при измерении скорости
#define useDebugInput //дебажный ввод из файла. Закомментировать для получения ввода из std::cin
то есть, когда будет реальное тестирование, все макросы нужно прикрыть

в функции GenerateInput для генерации файла задай нужные значения для
int tests=30;//10000;
int n =20;//100000;
int q =20;//100000;
проверть скороть работы можно с макросом useDebugInput и файлом "input"


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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <iostream>
#include <fstream>
#include <sstream>
#include <limits>
#include <cassert>
#include <vector>
#include <algorithm>
#include <ctime>
 
//#define useInputGenerator//Раскомментировать для генерации файла ввода
#define useAsserts      //дебажные ассерты. Закомментировать при измерении скорости
#define useDebugOutput  //дебажный вывод.   Закомментировать при измерении скорости
#define useDebugInput   //дебажный ввод из файла. Закомментировать для получения ввода из std::cin
 
void GenerateInput()
{
    std::srand(std::time(0));
    
    std::ofstream file{"input"};
    
    int tests=30;//10000;
    int n    =20;//100000;
    int q    =20;//100000;
        
    file<<tests<<'\n';
    
    for(int test=0; test!=tests; test++)
    {
        file<<n<<' '<<q<<' '<<'\n';
        
        for(int i=0; i!=n; i++)
        {
            int val=rand()%(1000000000+1);
            file<<val<<' ';
        }
        file<<'\n';
        
        for(int i=0; i!=q; i++)
        {
            int l=1+rand()%(n-1);
            int r=1+rand()%(n-1);
            if(!(l<=r))
            {
                std::swap(l,r);
            }
            
            int k=rand()%(1000000000+1);
            
            file<<l<<' '<<r<<' '<<k<<'\n';
        }
    }
}
 
template<typename T, T min, T max>
constexpr void check_lims(T object)noexcept
{
    static_assert(std::numeric_limits<T>::min()<=min);
    static_assert(std::numeric_limits<T>::max()>=max);
    #ifdef useAsserts
    assert(object>=min);
    assert(object<=max);
    #endif
}
 
int main()
{
    #ifdef useInputGenerator
    GenerateInput();
    return 0;
    #endif
    
    #ifdef useDebugInput
    std::ifstream input{"input"};
    #else
    auto& input=std::cin;
    #endif
 
    //Первая строка содержит количество наборов входных данных t(1≤t≤10^4).
    int tests; input>>tests; check_lims<decltype(tests),1,10000>(tests);
    #ifdef useDebugOutput
    std::cout<<"tests="<<tests<<'\n';
    #endif
 
    //сюда будут копиться ответы
    std::ostringstream oss_answers;
 
    std::vector<int> dataset;
    std::string dataline;
    dataset.reserve(100000);
    for(int test=0; test!=tests; test++)
    {
        #ifdef useDebugOutput
        std::cout<<'\n';
        std::cout<<"---test number="<<test+1<<" ---\n";
        #endif
        
        //Первая строка каждого набора входных данных содержит 2 целых числа n и q (1≤n≤2⋅10^5; 1≤q≤2⋅10^5)
        //—длина массива и количество запросов.
        int n; input>>n; check_lims<decltype(n),1,100000>(n);
        int q; input>>q; check_lims<decltype(q),1,100000>(q);
        getline(input,dataline);//обход перевода строки
 
        #ifdef useDebugOutput
        std::cout<<"n,q = "<<n<<','<<q<<'\n';
        #endif
        
        //Вторая строка каждого набора входных данных содержит n целых чисел ai (1≤ai≤10^9) — массив a.
        getline(input,dataline);
        #ifdef useDebugOutput
        std::cout<<"dataline = "<<dataline<<'\n';
        #endif
        
        dataset.clear();
        std::istringstream iss{dataline};
        int number;
        while(iss>>number)
        {
            check_lims<decltype(number),1,1000000000>(number);
            dataset.push_back(number);
        }
        #ifdef useAsserts
        assert(dataset.size()==n);
        #endif
 
        //Следующие q строк содержат по 3 целых числа l,r,k (1≤l≤r≤n; 1≤k≤10^9) — запросы.
        for(int subtest=0; subtest!=q; subtest++)
        {
            int l; input>>l;
            int r; input>>r;
            #ifdef useAsserts
            assert(1<=l);
            assert(l<=r);
            assert(r<=n);
            #endif
            
            int k; input>>k; check_lims<decltype(k),1,1000000000>(k);
            
            if(!input)break;
            
            #ifdef useDebugOutput
            std::cout<<"l,r,k = "<<l<<','<<r<<','<<k<<'\n';
            #endif
 
            //Гарантируется, что сумма n по всем наборам входных данных не превышает 2⋅10^5 и сумма q не превышает 2⋅10^5.
            int sum{};
            check_lims<decltype(sum),0,200000>(sum);
            
            //проверка:
            //Если сделать каждый элемент подотрезка массива al,al+1,…,ar равным k, будет ли сумма всего массива нечетной?
            
            //[0...l)
            for(int i=0; i!=l; i++){sum+=dataset[i];}
            
            //[l...r]
            //for(int i=l; i<=r; i++){sum+=k;}
            sum+=k*(r-l+1);
            
            //(r...n)
            for(int i=r+1; i<n; i++){sum+=dataset[i];}
            
            //Для каждого запроса выведите «YES», если сумма всего массива будет нечетной, и «NO» в противном случае.
            oss_answers<< (sum%2 ? "yes\n" : "no\n");
        }
 
        if(!input)break;
    }
    
    std::cout<<oss_answers.str();
}
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
23.03.2023, 09:44
Написал я тестовый кодик, правда на Qt. Для одного набора входных данных. И количество запросов 2*10^4 - в 10 раз меньше, чем в т.з. Время выполнения около 1 сек. Прога выдаёт на экран результат последнего вычисления и время выполнения:

C++ (Qt)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
void Widget::press_pbtn_01()
{
 
    // переменная для отсчёта времени выполнения
    QTime m_time;
 
    quint32 massiv[200000]; // макс. длина массива 2*10^5
    quint64 sum1 = 0;
    quint64 sum2, sum3;
 
    quint32 k, l, r;
    bool b1, b2, b3;
    QString str;
 
 
    // заполняем массив случайными числами
    for(int i = 0; i < 200000; i++)
        massiv[i] = QRandomGenerator::global()->bounded(1, 1000000001);
 
 
    // начало отсчёта времени выполнения
    m_time.start();
 
    // считаем сумму всего массива
    // это можно сделать 1 раз в пределах одного набора входных данных
    // т.к. массив в пределах одного набора входных данных не меняется
    for(int i = 0; i < 200000; i++)
        sum1 += massiv[i];
 
    // из всей суммы нас интересует, чётная она или нет
    b1 = sum1 & 1;
 
 
    // 2*10^5 - максимальное количество запросов
    for(int j = 0; j < 20000; j++)
    {
        sum2 = 0;
        sum3 = 0;
        b1 = sum1 & 1;
        str = "NO";
 
        l = QRandomGenerator::global()->bounded(0, 100000);         // 0 - 10^5
        r = QRandomGenerator::global()->bounded(100001, 200000);    // 10^5 - 2*10^5
        k = QRandomGenerator::global()->bounded(1, 1000000001);     // 1 - 10^9
 
 
        // сумма заменяемой части массива
        for(int i = l; i < r; i++)
            sum2 += massiv[i];
 
        // сумма новой части массива
        // т.к. заменяется одним числом, можно вычислить умножением
        sum3 = k * (r - l);
 
        // из сумм 2 и 3 нас также интересует только
        // чётные они или нет
        b2 = sum2 & 1;
        b3 = sum3 & 1;
 
        // если одна чётная, а другая нет
        // чётность суммы исходного массива меняется на противоположную
        if(b2 != b3) b1 = !b1;
 
        // если исходный массив нечётный, ставим YES
        if(b1) str = "YES";
    }
 
 
    // конец отсчёта времени выполнения
    qint64 msecs = m_time.elapsed();
    QTime time(0,0,0,0);
 
    ui->label_01->setText(QString::number(sum1));
    ui->label_02->setText(QString::number(sum2));
    ui->label_03->setText(QString::number(sum3));
 
    ui->label_04->setText(str);
 
    ui->label_10->setText(time.addMSecs(msecs).toString("hh:mm:ss.zzz"));
 
}
Миниатюры
Ускорить код  
1
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
23.03.2023, 09:47
alexu_007, кстати, да, можно заранее сумму вот так считать, но только для случая, когда длина заменяемого диапазона короче, чем половина массива. Лазейка для оптимизации
0
 Аватар для Наталья8
640 / 398 / 68
Регистрация: 09.03.2016
Сообщений: 4,396
23.03.2023, 13:03
Как вы на debug скорость проверяете? На дебаг медленнее работает...
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
23.03.2023, 19:11
Цитата Сообщение от Алексей1153 Посмотреть сообщение
но только для случая, когда длина заменяемого диапазона короче, чем половина массива
Почему?

Добавлено через 1 минуту
Цитата Сообщение от Наталья8 Посмотреть сообщение
Как вы на debug скорость проверяете? На дебаг медленнее работает...
С чего вы взяли, что дебиг? Дебиг и профилирование (не знаю что такое) у меня в настройках отключены, только релиз.
0
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
23.03.2023, 20:02
alexu_007, потому что выгодно заранее посчитать сумму более половины элементов. А вот каждый раз считать сумму более половины элементов - это невыгодно
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
23.03.2023, 22:59
Я ничего не понял. Зачем нужна сумма более половины элементов?
0
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
24.03.2023, 08:45
alexu_007,
1) перед всей движухой считаем сумму всех элементов (n)
2) внутри цикла считаем сумму заменяемой области (lr) , чтобы вычесть её из основной суммы и прибавить туда k*(r-l+1)

очевидно, что в пункте 2 нужно сделать две ветки - если lr<n/2 , то делаем как описано, это выгодно. Но если lr длиннее половины массива, то выгоднее суммировать первый отрезок и конечный, а уже туда добавить k*(r-l+1)
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
24.03.2023, 09:12
1) перед всей движухой считаем сумму всех элементов (n), и определяем, чётная сумма или нет
2) внутри цикла считаем сумму заменяемой области (lr), и определяем, чётное значение или нет
3) вычисляем k*(r-l+1) и определяем, чётное значение или нет

Если второе и третье значения совпадают (оба чётные или оба нет) - то четность основной суммы не меняется. Если не совпадают - четность основной суммы меняется на противоположную. И не нужно суммировать никаких отрезков

C++
1
2
3
4
bool b1 = sum1 & 1;
bool b2 = sum2 & 1;
bool b3 = sum3 & 1;
if (b2 != b3) b1 = !b1;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.03.2023, 09:12

Гипотеза Коллатца(ускорить код)
Существует вот такая вот гипотеза Коллатца(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) { ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru