Добавить Middle-задачи по массивам #7
1 файл изменён
+80
Войди, чтобы оставлять замечания к строкам.
Показать разницуСкрыть разницу
| @@ -0,0 +1,80 @@ | |||
| 1 | +# 🟡 Middle — массивы | ||
| 2 | + | ||
| 3 | +Четыре авторские задачи на эффективные алгоритмы, ограничение дополнительной памяти и обработку буферов. | ||
| 4 | + | ||
| 5 | +## 1. Объединение двух поставок | ||
| 6 | + | ||
| 7 | +Даны два массива, отсортированных по неубыванию: `A` длины `N` и `B` длины `M`. В `A` уже выделено место для `N + M` чисел: первые `N` ячеек содержат данные, оставшиеся `M` предназначены для результата. Объедините массивы в `A`, сохранив сортировку. Дополнительный массив создавать нельзя. | ||
| 8 | + | ||
| 9 | +**Ввод:** `N M` (`0 ≤ N,M ≤ 2·10^5`), затем `N` чисел массива `A` и `M` чисел массива `B` (`|x| ≤ 10^9`). | ||
| 10 | + | ||
| 11 | +**Вывод:** объединённый отсортированный массив длины `N + M`. | ||
| 12 | + | ||
| 13 | +**Пример:** | ||
| 14 | +```text | ||
| 15 | +4 3 | ||
| 16 | +1 4 7 9 | ||
| 17 | +2 4 10 | ||
| 18 | +``` | ||
| 19 | +```text | ||
| 20 | +1 2 4 4 7 9 10 | ||
| 21 | +``` | ||
| 22 | + | ||
| 23 | +**Требование:** `O(N+M)` времени и `O(1)` дополнительной памяти. Заполняйте `A` с конца, чтобы не перезаписать необработанные значения. | ||
| 24 | + | ||
| 25 | +## 2. Самый длинный бюджетный отрезок | ||
| 26 | + | ||
| 27 | +Дан массив неотрицательных стоимостей товаров и бюджет `S`. Найдите максимальную длину непрерывного отрезка, сумма которого не превышает `S`. Пустой отрезок допустим и имеет длину `0`. | ||
| 28 | + | ||
| 29 | +**Ввод:** `N S` (`1 ≤ N ≤ 2·10^5`, `0 ≤ S ≤ 10^18`), затем `N` чисел `cost_i` (`0 ≤ cost_i ≤ 10^9`). | ||
| 30 | + | ||
| 31 | +**Вывод:** максимальная длина подходящего отрезка. | ||
| 32 | + | ||
| 33 | +**Пример:** | ||
| 34 | +```text | ||
| 35 | +6 8 | ||
| 36 | +2 1 3 2 4 1 | ||
| 37 | +``` | ||
| 38 | +```text | ||
| 39 | +3 | ||
| 40 | +``` | ||
| 41 | + | ||
| 42 | +**Требование:** `O(N)` времени и `O(1)` дополнительной памяти. Используйте скользящее окно: неотрицательность цен гарантирует, что при сдвиге левой границы сумма не увеличится. Для суммы используйте 64-битный тип. | ||
| 43 | + | ||
| 44 | +## 3. Максимум в каждом окне | ||
| 45 | + | ||
| 46 | +Для каждого непрерывного окна длины `K` выведите максимальное значение массива. | ||
| 47 | + | ||
| 48 | +**Ввод:** `N K` (`1 ≤ K ≤ N ≤ 2·10^5`), затем `N` целых чисел `a_i` (`|a_i| ≤ 10^9`). | ||
| 49 | + | ||
| 50 | +**Вывод:** `N-K+1` максимумов в порядке окон. | ||
| 51 | + | ||
| 52 | +**Пример:** | ||
| 53 | +```text | ||
| 54 | +8 3 | ||
| 55 | +1 3 -1 -3 5 3 6 7 | ||
| 56 | +``` | ||
| 57 | +```text | ||
| 58 | +3 3 5 5 6 7 | ||
| 59 | +``` | ||
| 60 | + | ||
| 61 | +**Требование:** `O(N)` времени и `O(K)` дополнительной памяти. Используйте двустороннюю очередь индексов: удаляйте устаревшие индексы слева и меньшие значения справа. Не копируйте каждое окно. | ||
| 62 | + | ||
| 63 | +## 4. Циклический сдвиг части массива | ||
| 64 | + | ||
| 65 | +Дан массив и полуинтервал `[L, R)` — элементы с индексами `L, L+1, ..., R-1`. Циклически сдвиньте только этот участок вправо на `K` позиций. Остальная часть массива не меняется. `K` может быть больше длины участка. | ||
| 66 | + | ||
| 67 | +**Ввод:** `N L R K` (`1 ≤ N ≤ 2·10^5`, `0 ≤ L < R ≤ N`, `0 ≤ K ≤ 10^18`), затем `N` целых чисел. | ||
| 68 | + | ||
| 69 | +**Вывод:** массив после сдвига. | ||
| 70 | + | ||
| 71 | +**Пример:** | ||
| 72 | +```text | ||
| 73 | +7 1 6 2 | ||
| 74 | +10 20 30 40 50 60 70 | ||
| 75 | +``` | ||
| 76 | +```text | ||
| 77 | +10 50 60 20 30 40 70 | ||
| 78 | +``` | ||
| 79 | + | ||
| 80 | +**Требование:** `O(N)` времени и `O(1)` дополнительной памяти. Сведите `K` по модулю длины участка и используйте три разворота подотрезков. | ||