JustCaptain kod-buduschego
7efceb421dbc5c7b77700ed9dbec228ce6d15358
Перейти к файлу
Код
kod-buduschego C++МассивыMiddle.md
JustCaptain Merge branch 'llm/middle-8396c3' into 'main' bb03bcd 2 недели назад
Middle.md

🟡 Middle — массивы#

Четыре авторские задачи на эффективные алгоритмы, ограничение дополнительной памяти и обработку буферов.

1. Объединение двух поставок#

Даны два массива, отсортированных по неубыванию: A длины N и B длины M. В A уже выделено место для N + M чисел: первые N ячеек содержат данные, оставшиеся M предназначены для результата. Объедините массивы в A, сохранив сортировку. Дополнительный массив создавать нельзя.

Ввод: N M (0 ≤ N,M ≤ 2·10^5), затем N чисел массива A и M чисел массива B (|x| ≤ 10^9).

Вывод: объединённый отсортированный массив длины N + M.

Пример:

4 3
1 4 7 9
2 4 10
1 2 4 4 7 9 10

Требование: O(N+M) времени и O(1) дополнительной памяти. Заполняйте A с конца, чтобы не перезаписать необработанные значения.

2. Самый длинный бюджетный отрезок#

Дан массив неотрицательных стоимостей товаров и бюджет S. Найдите максимальную длину непрерывного отрезка, сумма которого не превышает S. Пустой отрезок допустим и имеет длину 0.

Ввод: N S (1 ≤ N ≤ 2·10^5, 0 ≤ S ≤ 10^18), затем N чисел cost_i (0 ≤ cost_i ≤ 10^9).

Вывод: максимальная длина подходящего отрезка.

Пример:

6 8
2 1 3 2 4 1
3

Требование: O(N) времени и O(1) дополнительной памяти. Используйте скользящее окно: неотрицательность цен гарантирует, что при сдвиге левой границы сумма не увеличится. Для суммы используйте 64-битный тип.

3. Максимум в каждом окне#

Для каждого непрерывного окна длины K выведите максимальное значение массива.

Ввод: N K (1 ≤ K ≤ N ≤ 2·10^5), затем N целых чисел a_i (|a_i| ≤ 10^9).

Вывод: N-K+1 максимумов в порядке окон.

Пример:

8 3
1 3 -1 -3 5 3 6 7
3 3 5 5 6 7

Требование: O(N) времени и O(K) дополнительной памяти. Используйте двустороннюю очередь индексов: удаляйте устаревшие индексы слева и меньшие значения справа. Не копируйте каждое окно.

4. Циклический сдвиг части массива#

Дан массив и полуинтервал [L, R) — элементы с индексами L, L+1, ..., R-1. Циклически сдвиньте только этот участок вправо на K позиций. Остальная часть массива не меняется. K может быть больше длины участка.

Ввод: N L R K (1 ≤ N ≤ 2·10^5, 0 ≤ L < R ≤ N, 0 ≤ K ≤ 10^18), затем N целых чисел.

Вывод: массив после сдвига.

Пример:

7 1 6 2
10 20 30 40 50 60 70
10 50 60 20 30 40 70

Требование: O(N) времени и O(1) дополнительной памяти. Сведите K по модулю длины участка и используйте три разворота подотрезков.