JustCaptain kod-buduschego

Добавить Middle-задачи по массивам #7

Слито JustCaptain слил(а) llm/middle-8396c3 → main · bb03bcd
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` по модулю длины участка и используйте три разворота подотрезков.