JustCaptain kod-buduschego

Merge branch 'llm/middle-8396c3' into 'main'

JustCaptain · 2 недели назад bb03bcdc780611e5fa808dc647b9a71eb07c292d
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` по модулю длины участка и используйте три разворота подотрезков.