Merge branch 'llm/middle-8396c3' into 'main'
Родитель:
fe80956
· сравнить с родителем
1 файл
-
Показать разницуСкрыть разницу
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` по модулю длины участка и используйте три разворота подотрезков.