JustCaptain kod-buduschego

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

Слито JustCaptain слил(а) llm/middle-a37abf → main · 27a7473
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)` дополнительной памяти сверх матрицы. Поддерживайте четыре границы непройденной области и аккуратно проверяйте, что после сужения границ остались строки или столбцы.