Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
184 / 72 / 35
Регистрация: 09.05.2022
Сообщений: 387

Оптимизация кода по скорости работы

20.04.2023, 09:42. Показов 744. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Условия задачи:
Набор в армию (тема: Дерево отрезков). Роберт Баратеон понимает, что войны с
Таргариенами не избежать. Но сейчас зима, они не будут наступать, пока не начнется
лето. Лето наступит через год, то есть через 366 дней – не так уж и много. Поэтому Роберт
хочет успеть собрать себе за это время армию.
У него есть n рыцарей, у рыцаря с номером i есть ai солдат в подчинении. Роберт
отдал приказ своим рыцарям собирать больше солдат, и вечером каждого дня ему
приходит донесение, которое имеет следующий вид: «Рыцари с номерами с l по r нашли
себе еще по одному солдату».
Также в любой момент времени Роберт может посмотреть на отряды солдат
рыцарей с номерами с l по r и, исходя из этой информации, посчитать количество
способов выбрать главнокомандующих у каждого из этих r - l + 1 отрядов солдат. Все
солдаты в отрядах равноценно могут быть главнокомандующими, два способа считаются
различными, если в них отличаются хотя бы два главнокомандующих.
Число может получиться довольно большим, поэтому Роберт хочет знать только его
остаток от деления на 1000003.
Король Семи Королевств не силен в математике, поэтому он попросил Вас помочь
ему в решении этой задачи.
Формат входных данных
Первая строка входного файла содержит число n (1 ≤ n ≤ 10^5) – количество рыцарей
у Роберта.
Вторая строка содержит n целых чисел ai (1 ≤ ai ≤ 10^9) – начальное количество
солдат у i-го рыцаря.
В третьей строке входного файла дано число q (1 ≤ q ≤ 10^5) – количество запросов.
В следующих q строках входного файла описаны запросы. Каждый запрос описывается
тремя числами a, l, r (0 ≤ a ≤ 1, 1 ≤ l ≤ r ≤ n).
a = 0 означает увеличение количества солдат у всех рыцарей с номерами с l по r
включительно на один.
a=1 означает запрос на подсчет количества способов выбрать главнокомандующих
у отрядов рыцарей с номерами c l по r включительно.
Гарантируется, что донесение об увеличении количества солдат приносили Роберту
на чаще одного раза в день, то есть не более 366 раз.
Формат выходных данных
На каждый запрос с a=1 в выходной файл выведите ответ на запрос.
Пример:
input.txt
5
1 2 3 4 5
6
1 1 5
0 3 3
0 2 4
1 1 3
1 1 4
1 1 5
output.txt
120
15
75
375

у меня есть программа, которая выдает runTimeError на некоторых данных, надо оптимизировать. Но как?

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
#include <fstream>
#include <iostream>
#include <vector>
 
using namespace std;
 
const int MOD = 1000003;
 
int main() {
    ios_base::sync_with_stdio(false); // отключаем синхронизацию C++ и C стандартных потоков ввода-вывода, для более быстрой работы
    cin.tie(NULL); // отключаем связывание потока ввода с потоком вывода, для более быстрой работы
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    
    int n;
    fin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        fin >> a[i];
        a[i] %= MOD; // уменьшаем значения вектора, чтобы не выйти за границы MOD
    }
 
    int q;
    fin >> q;
    while (q--) {
        int op, l, r;
        fin >> op >> l >> r;
        if (op == 0) {
            for (int i = l - 1; i < r; i++) {
                a[i]++; // увеличиваем значение элемента вектора
                a[i] %= MOD; // уменьшаем значение элемента вектора, чтобы не выйти за границы MOD
            }
        } else {
            int ans = 1;
            for (int i = l - 1; i < r; i++) {
                ans *= a[i];
                ans %= MOD; // уменьшаем значение ans, чтобы не выйти за границы MOD
            }
            fout << ans << "\n"; // выводим результат в файл с помощью символа новой строки, который работает быстрее, чем std::endl
        }
    }
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.04.2023, 09:42
Ответы с готовыми решениями:

Поиск Пифагоровых троек: оптимизация кода по скорости
Помогите усовершенствовать код, чтобы он выполнялся быстрее. Если вкратце, то тут идёт поиск Пифагоровых троек. #include...

Нужен совет: оптимизация кода, увеличение скорости работы скрипта
Всем привет. Имеется код выводящий из массива названия регионов РФ с указанием буквы. Получается что-то вроде такого: А ...

Оптимизация скорости кода
a=2 b=3 c=5 d=50 your=int(input(&quot;Введите ваш баланс:&quot;)) def proga(x): for i in range(0,x+1): for w in range(0,x+1): ...

11
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
20.04.2023, 10:04
Цитата Сообщение от karlhildekruger Посмотреть сообщение
которая выдает runTimeError
Какую именно runTimeError ? на какой строке?
и на каких именно данных? хорошо бы вам взяться и проанализировать.

Умозрительно заметил только вот что

C++
1
2
3
           for (int i = l - 1; i < r; i++) {
                a[i]++; // увеличиваем значение элемента вектора
                a[i] %= MOD; // уменьшаем значение элемента вектора, чтобы не выйти за границы MOD
a[] у нас размера n
Однако мы без проверки смело лезем в a[] до элемента l-1
Хорошо бы проверить корерктность входных данных тут
0
184 / 72 / 35
Регистрация: 09.05.2022
Сообщений: 387
20.04.2023, 16:51  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
на какой строке?
Не знаю. Просто какие-то неизвестные входные данные, вероятно просто очень большие. Загружаю в контест, и получаю ответ в баллах, выдает 45 из 100, первые 6 тестов проходит, оставшиеся runTimeError. Моя программа не справляется по скорости работы.
0
20.04.2023, 16:54

Не по теме:

Одно не понять: зачем на форум??
Ну так сидите и долбите вы этот контес!! и головой шурупьте, блин. Оно ж для того и обучение, чтобы своей головой шурупить, а не готовые ответы получать.

Цитата Сообщение от karlhildekruger Посмотреть сообщение
получаю ответ в баллах, выдает 45 из 100,
На второй год, значит, оставаться.

0
184 / 72 / 35
Регистрация: 09.05.2022
Сообщений: 387
21.04.2023, 08:20  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Одно не понять: зачем на форум??
Перечитай вопрос, если не можешь понять. Готовый код никто не просит, это тоже перечитай, я выложил рабочий код, который надо оптимизировать. Спрашивается, как ускорить программу.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Ну так сидите и долбите
ну по такой логике, пусть сами во всем разбираются, а не спрашивают у тех, кто знает. Тогда смысла в форуме не будет. Не знаешь ответ, иди мимо, не мешай другим работать.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
21.04.2023, 08:38
Цитата Сообщение от karlhildekruger Посмотреть сообщение
которая выдает runTimeError на некоторых данных
какая нафик оптимизация??

То что я писал в самом первом сообщении - сделано?

Добавлено через 3 минуты
Цитата Сообщение от karlhildekruger Посмотреть сообщение
пусть сами во всем разбираются,
Конечно, а как ты хотел?
одно только условие никто не станет дочитывать.

Есть смысл приходить со здравыми, относительно кратко сформулированными запросами.
А тут вникать разбираться, читать всю эту муть про рыцарей - кому надо.

Добавлено через 36 секунд

Не по теме:

PS
Начало вообще идеальное, в духе времени

Цитата Сообщение от karlhildekruger Посмотреть сообщение
Набор в армию

0
 Аватар для Pphantom
2318 / 1560 / 721
Регистрация: 17.03.2022
Сообщений: 5,018
21.04.2023, 11:30
karlhildekruger, дурацкий вопрос - а вам обязательно юзать vector? Попробуйте вместо него сделать обычный динамический массив. Скорее всего, таким путем скорость удастся увеличить: STL - штука довольно медленная, а ее возможностями вы все равно фактически не пользуетесь.
1
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
21.04.2023, 11:50
Цитата Сообщение от Pphantom Посмотреть сообщение
STL - штука довольно медленная
с чего вдруг? В векторе всё тот же массив на куче. Разницы в скорости не будет
1
 Аватар для Pphantom
2318 / 1560 / 721
Регистрация: 17.03.2022
Сообщений: 5,018
21.04.2023, 11:53
Цитата Сообщение от Алексей1153 Посмотреть сообщение
с чего вдруг? В векторе всё тот же массив на куче. Разницы в скорости не будет
Он несколько более "интеллектуальный", соответственно, что-то тратится на проверки корректности.

Во всяком случае, я бы попробовал. Тут цена вопроса - замена буквально одной строки кода.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
21.04.2023, 11:55
я бы лучше попробовал чтение файла произвести до цикла - в тот же вектор. Потом работаем с содержимым вектора и формируем вектор для записи в файл. Затем, после цикла, пишем в файл
0
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
21.04.2023, 11:56
в задаче у вектора только доступ по индексу, и тип int
так что разницы никакой.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
21.04.2023, 11:59
ну и вот это сделать одним действием
Цитата Сообщение от karlhildekruger Посмотреть сообщение
a[i]++; // увеличиваем значение элемента вектора
                a[i] %= MOD; // уменьшаем значение элемента вектора, чтобы не выйти за границы MOD
C++
1
a[i]=(a[i]+1)%MOD;
и это
Цитата Сообщение от karlhildekruger Посмотреть сообщение
a[i]++; // увеличиваем значение элемента вектора
                a[i] %= MOD; // уменьшаем значение элемента вектора, чтобы не выйти за границы MOD
C++
1
a[i]=(a[i]+1)%MOD;
и это
Цитата Сообщение от karlhildekruger Посмотреть сообщение
ans *= a[i];
                ans %= MOD; // уменьшаем значение ans, чтобы не выйти за границы MOD
C++
1
ans = (ans*a[i])%MOD;
хотя, оптимизатор, скорее всего, сам уже так сделал

Добавлено через 59 секунд
Цитата Сообщение от Pphantom Посмотреть сообщение
соответственно, что-то тратится на проверки корректности.
в операторе [] - не тратится
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2023, 11:59
Помогаю со студенческими работами здесь

Оптимизация кода по скорости
Всем добрый день. Помогите ускорить выполнения кода. using System; using System.ComponentModel.DataAnnotations; using static...

Оптимизация скорости кода
Необходимо(дать совет по оптимизации) оптимизировать код, чтоб меньше времени занимало на обработку данных. Подробнее о задаче можно...

Оптимизация кода по скорости (K1986BE92QI Keil)
Для тех кому лениво читать: посоветуйте что почитать по оптимизации кода в плане скорости. Для тех кому не лениво читать: Есть...

Оптимизация скорости работы с БД (ADO, DataEnvironment)
Привет! Заканчиваю работу над приложением - интерфейсом БД. Использую MySQL через ADODB, DataEnvironment (один connection),...

Оптимизация кода для повышения скорости выполнения?
Есть ли какая возможность в VBA замера производительности как в 1С с указанием относительного времени исполнения отдельных строк кода, что...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru