Добавить Middle-задачи по двумерным массивам
Родитель:
a8f57e3
· сравнить с родителем
1 файл
-
Показать разницуСкрыть разницу
1 +# 🟡 Middle — двумерные массивы 2 + 3 +Четыре авторские задачи на эффективный обход матриц, префиксные суммы и осознанное использование дополнительной памяти. 4 + 5 +## 1. Запросы по складу 6 + 7 +В таблице `R × C` хранятся количества товаров в ячейках склада. Затем поступают запросы прямоугольных областей. Для каждого запроса найдите сумму в прямоугольнике с верхним левым углом `(r1,c1)` и нижним правым `(r2,c2)`, координаты включены и начинаются с нуля. 8 + 9 +**Ввод:** `R C Q` (`1 ≤ R,C ≤ 2000`, `1 ≤ Q ≤ 2·10^5`), затем матрица неотрицательных значений не больше `10^6`, затем `Q` запросов `r1 c1 r2 c2` с корректными координатами. 10 + 11 +**Вывод:** сумма для каждого запроса в отдельной строке. 12 + 13 +**Пример:** 14 +```text 15 +3 4 2 16 +1 2 3 4 17 +5 6 7 8 18 +9 10 11 12 19 +0 1 1 2 20 +1 0 2 3 21 +``` 22 +```text 23 +18 24 +68 25 +``` 26 + 27 +**Требование:** предварительная обработка `O(R*C)`, каждый запрос `O(1)`, дополнительная память `O(R*C)`. Используйте двумерные префиксные суммы и 64-битный тип; не проходите заново по каждой области. 28 + 29 +## 2. Поворот изображения на 90 градусов 30 + 31 +Дана прямоугольная матрица пикселей размера `R × C`. Поверните её по часовой стрелке на 90 градусов и выведите результат размера `C × R`. 32 + 33 +**Ввод:** `R C` (`1 ≤ R,C ≤ 2000`), затем `R*C` целых чисел `a[r][c]` (`|a[r][c]| ≤ 10^9`). 34 + 35 +**Вывод:** сначала размеры `C R`, затем повернутая матрица. Элемент исходной клетки `(r,c)` переходит в `(c, R-1-r)`. 36 + 37 +**Пример:** 38 +```text 39 +2 3 40 +1 2 3 41 +4 5 6 42 +``` 43 +```text 44 +3 2 45 +4 1 46 +5 2 47 +6 3 48 +``` 49 + 50 +**Требование:** `O(R*C)` времени. Разрешён один выходной буфер `O(R*C)`, но не создавайте несколько промежуточных копий. Обоснуйте, почему простая транспозиция на месте для прямоугольной матрицы не подходит. 51 + 52 +## 3. Суммы соседей с минимальной памятью 53 + 54 +Для каждой клетки числовой матрицы вычислите сумму её соседей по стороне: сверху, снизу, слева и справа. Сама клетка не считается соседом. Для клеток на границе учитывайте только существующих соседей. 55 + 56 +**Ввод:** `R C` (`1 ≤ R,C ≤ 2000`), затем `R*C` целых чисел `a[r][c]` (`|a[r][c]| ≤ 10^6`). 57 + 58 +**Вывод:** матрица сумм того же размера. 59 + 60 +**Пример:** 61 +```text 62 +2 3 63 +1 2 3 64 +4 5 6 65 +``` 66 +```text 67 +6 9 7 68 +7 10 8 69 +``` 70 + 71 +**Требование:** `O(R*C)` времени и не более `O(C)` дополнительной памяти сверх входной матрицы. Сначала считайте исходные данные, затем обрабатывайте построчно, сохраняя только строки, необходимые для вычисления. Выводите результат сразу, не выделяя вторую матрицу. 72 + 73 +## 4. Спиральная выдача 74 + 75 +Дан прямоугольный массив, представляющий слои коробок на складе. Выведите элементы по часовой спирали, начиная с верхнего левого угла и двигаясь вправо. Каждый элемент должен появиться ровно один раз, включая матрицы из одной строки или одного столбца. 76 + 77 +**Ввод:** `R C` (`1 ≤ R,C ≤ 1000`), затем матрица целых чисел (`|a[r][c]| ≤ 10^9`). 78 + 79 +**Вывод:** все элементы в порядке спирального обхода. 80 + 81 +**Пример:** 82 +```text 83 +3 4 84 +1 2 3 4 85 +5 6 7 8 86 +9 10 11 12 87 +``` 88 +```text 89 +1 2 3 4 8 12 11 10 9 5 6 7 90 +``` 91 + 92 +**Требование:** `O(R*C)` времени и `O(1)` дополнительной памяти сверх матрицы. Поддерживайте четыре границы непройденной области и аккуратно проверяйте, что после сужения границ остались строки или столбцы.