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

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

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

Author24 — интернет-сервис помощи студентам
Ограничение по времени работы: 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 целых чисел: ответы на все запросы.

Пример:
Код
Ввод:        Вывод:
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Блог
13.07.2022, 12:52
Ответы с готовыми решениями:

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

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

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

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

2
1710 / 1110 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
13.07.2022, 20:07 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
Помогло, спасибо!
0
13.07.2022, 21:25
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
13.07.2022, 21:25
Помогаю со студенческими работами здесь

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

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

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

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

Задача на нахождение суммы
Написать программу на языке Basic,найти величину S и вывести ее на печать.Заранее благодарю за...

Задача:Ряд суммы
В общем в задании сказано что при проверке разница cos(X) ,с моей функцией будет не более eps....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru