JustCaptain kod-buduschego

Добавить Middle-задачи по двумерным массивам

JustCaptain · 2 недели назад 27a7473e506a4bc52e95e3c8e2b1d9daa4087b34
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)` дополнительной памяти сверх матрицы. Поддерживайте четыре границы непройденной области и аккуратно проверяйте, что после сужения границ остались строки или столбцы.