Добавить Middle-задачи по двумерным массивам #9
1 файл изменён
+92
Войди, чтобы оставлять замечания к строкам.
Показать разницуСкрыть разницу
| @@ -0,0 +1,92 @@ | |||
| 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)` дополнительной памяти сверх матрицы. Поддерживайте четыре границы непройденной области и аккуратно проверяйте, что после сужения границ остались строки или столбцы. | ||