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

Задача "Суммы на прямоугольниках"

13.07.2022, 12:52. Показов 2969. Ответов 2

Студворк — интернет-сервис помощи студентам
Ограничение по времени работы: 2 секунды
Условие:
Дана прямоугольная матрица (таблица чисел), содержащая N строк и M столбцов. Строки пронумеруем числами от 1 до N сверху вниз, столбцы пронумеруем числами от 1 до M слева направо. Рассмотрим какой-либо прямоугольник внутри данной матрицы. Пусть (x1, y1) — координаты его левого верхнего угла (то есть номер строки и номер столбца клетки, которая является левой верхней клеткой), (x2, y2) — координаты его правого нижнего угла. Научитесь быстро вычислять сумму всех чисел внутри произвольного такого прямоугольника.

Входные данные:
Программа получает на вход три числа N, M, K. Следующие N строк содержат по M целых неотрицательных чисел от 0 до 1000 каждое. Следующие K строк содержат по одному запросу на вычисление суммы: четыре числа x1, y1, x2, y2 (1<=x1<=x2<=N),(1<=y1<=y2<=M). Ограничения: (N*M <= 50000), (K <= 50000).

Выходные данные:
Программа должна вывести K целых чисел: ответы на все запросы.

Пример:
Code
1
2
3
4
5
6
7
Ввод:        Вывод:
3 3 2         28
1 2 3         21
4 5 6
7 8 9
2 2 3 3
1 1 2 3
Мое решение:

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
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
typedef long long ll;
 
ll AT(vector<vector<ll>> p, ll i, ll j) {
    if (i < 0 || j < 0) {
        return 0ll;
    }
    return p[i][j];
}
 
int main() {
    ll n, m, k;
    cin >> n >> m >> k;
    vector<vector<ll>> a(n, vector<ll>(m)), pref(n, vector<ll>(m));
    for (ll i = 0; i < n; i++) {
        for (ll j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }
    pref[0][0] = a[0][0];
    for (ll i = 0; i < n; i++) {
        for (ll j = 0; j < m; j++) {
            if (i >= 1 && j >= 1) {
                pref[i][j] += pref[i - 1][j] + pref[i][j - 1] + a[i][j] - pref[i-1][j-1];
            }
            if (i >= 1 && j < 1) {
                pref[i][j] += pref[i - 1][j] + a[i][j];
            }
            if (i < 1 && j >= 1) {
                pref[i][j] += pref[i][j - 1] + a[i][j];
            }
        }
    }
    for (ll i = 0; i < k; i++) {
        ll x1, x2, y1, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        x1--;
        y1--;
        x2--;
        y2--;
        cout << AT(pref, x2, y2) - AT(pref, x1 - 1, y2) - AT(pref, x2, y1 - 1) + AT(pref, x1 - 1, y1 - 1) << endl;
    }
}
Проходит только часть тестов, буду благодарен за подсказку в решении.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.07.2022, 12:52
Ответы с готовыми решениями:

Задача о прямоугольниках С++
Уважаемые форумчане,помогите решить следующую задачу На клеточном листе бумаги размером MхN расположены прямоугольники. Задан массив...

Задача о квадратах и прямоугольниках
Даны целые положительные числа A, B, C. На прямоугольнике размера A  B размещено максимально возможное количество квадратов со стороной C...

Как написать слово в прямоугольниках
Как в рамусе в диаграммах DFD писать слова внутри прямоугольников?Помогите пожалуйста.

2
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
13.07.2022, 20:07
Лучший ответ Сообщение было отмечено georgeboiko как решение

Решение

Нашел похожую тестилку, так там проходит:
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
#include <iostream>
#include <vector>
 
int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(0);
 
    size_t n {}, m {}, k {};
    std::cin >> n >> m >> k;
    ++n;
    ++m;
 
    std::vector<std::vector<uint64_t>> mx(n, std::vector<uint64_t>(m, 0));
 
    for(size_t y { 1 }; y < n; ++y)
        for(size_t x { 1 }; x < m; ++x)
        {
            uint64_t val {};
            std::cin >> val;
            mx[y][x] = val + mx[y - 1][x] + mx[y][x - 1] - mx[y - 1][x - 1];
        }
 
    size_t a {}, b {}, c {}, d {};
    for(size_t i { 0 }; i < k; ++i)
    {
        std::cin >> b >> a >> d >> c;
        std::cout << mx[d][c] + mx[b - 1][a - 1] - mx[d][a - 1] - mx[b - 1][c] << "\n";
    }
 
    return 0;
}
Условие там, правда, несколько отличается
В первой строке входного файла INPUT.TXT записаны 3 числа: N и M – число строк и столбцов матрицы (1 ≤ N, M ≤ 1000) и K - количество запросов (1 ≤ K ≤ 105). Каждая из следующих N строк содержит по M чисел - элементы Aij соответствующей строки матрицы (1 ≤ Aij ≤ 104). Последующие K строк содержат по 4 целых числа - y1, x1, y2 и x2 - запрос на сумму элементов в прямоугольнике (1 ≤ y1 ≤ y2 ≤ N, 1 ≤ x1 ≤ x2 ≤ M).
Сам принцип подсчёта у меня схож с твоим (не пойму, правда, зачем там два массива), но если не вырубать синхронизацию потоков - вылезает time limit, в эту сторону проверь.
1
0 / 0 / 0
Регистрация: 28.11.2021
Сообщений: 4
13.07.2022, 21:25  [ТС]
Помогло, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2022, 21:25
Помогаю со студенческими работами здесь

Выполнить структурированную запись и чтение информации о прямоугольниках из файла
Требование к программе: 1.Текст программы представлен в электронном виде и должен включать постановку задачи. 2.Название переменных и...

Выполнить структурированную запись/чтение информации о прямоугольниках в (из) файл
Выполнить структурированную запись/чтение информации о прямоугольниках в (из) файл. Прямоугольники необходимо вывести на экран в...

Выводить пикселы в прямоугольниках, расположенных: в левой нижней четверти экрана
Выводить пикселы в прямоугольниках, расположенных: в левой нижней четверти экрана (использовать яркие цвета), в правой верхней четверти...

Вводится массив, каждый элемент которого содержит сведения о двух прямоугольниках
Вводится массив, каждый элемент которого содержит сведения о двух прямоугольниках(целочисленные координаты левого верхнего и правого...

Задача на бесконечные суммы


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 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-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru