JustCaptain kod-buduschego

Добавить оставшиеся Middle и Senior задачи по массивам #6

Закрыто JustCaptain хочет слить llm/middle-senior-1ddacb → main
2 файла изменено +181

Войди, чтобы оставлять замечания к строкам.

Показать разницуСкрыть разницу
@@ -0,0 +1,90 @@
1 +# 🟠 Middle — массивы
2 +
3 +Четыре авторские задачи на скользящее окно, префиксные суммы, слияние и компактную работу с памятью.
4 +
5 +## 1. Удаление устаревших измерений
6 +
7 +В журнале датчика записаны значения. Удалите все значения, меньшие порога `X`, сохранив порядок оставшихся. Сдвигайте элементы внутри исходного массива, не создавая второй массив.
8 +
9 +**Ввод:** `N X` (`1 ≤ N ≤ 2·10^5`, `-10^9 ≤ X ≤ 10^9`), затем `N` целых чисел `a_i` (`|a_i| ≤ 10^9`).
10 +
11 +**Вывод:** количество оставшихся значений, затем сами значения. Если ни одного не осталось, выведите только `0`.
12 +
13 +**Пример:**
14 +```text
15 +7 5
16 +8 2 5 1 9 4 7
17 +```
18 +```text
19 +4
20 +8 5 9 7
21 +```
22 +
23 +**Требование:** `O(N)` времени и `O(1)` дополнительной памяти. Подумайте, почему удалять элементы по одному из середины вектора невыгодно.
24 +
25 +## 2. Суммы отрезков
26 +
27 +Дан массив расходов за `N` дней и `Q` запросов. Для каждого запроса найдите сумму расходов на отрезке от `L` до `R` включительно. Индексы во входе начинаются с единицы.
28 +
29 +**Ввод:** `N Q` (`1 ≤ N,Q ≤ 2·10^5`), затем `N` неотрицательных чисел не больше `10^9`, затем `Q` пар `L R` (`1 ≤ L ≤ R ≤ N`).
30 +
31 +**Вывод:** для каждого запроса выведите сумму на отдельной строке.
32 +
33 +**Пример:**
34 +```text
35 +5 3
36 +2 4 1 7 3
37 +1 3
38 +2 5
39 +4 4
40 +```
41 +```text
42 +7
43 +15
44 +7
45 +```
46 +
47 +**Требование:** `O(N+Q)` времени. Используйте префиксные суммы типа `long long`; массив префиксов занимает `O(N)` дополнительной памяти.
48 +
49 +## 3. Слияние двух журналов
50 +
51 +Даны два отсортированных по неубыванию массива временных меток. Объедините их в один отсортированный массив. При равных значениях сначала берите элемент из первого массива.
52 +
53 +**Ввод:** `N M` (`0 ≤ N,M ≤ 2·10^5`), затем `N` чисел первого массива и `M` чисел второго; значения по модулю не превосходят `10^9`.
54 +
55 +**Вывод:** `N+M` чисел объединённого массива.
56 +
57 +**Пример:**
58 +```text
59 +4 3
60 +1 4 4 9
61 +2 4 8
62 +```
63 +```text
64 +1 2 4 4 4 8 9
65 +```
66 +
67 +**Требование:** `O(N+M)` времени. Результат неизбежно занимает `O(N+M)` памяти; избегайте повторных вставок в начало вектора.
68 +
69 +## 4. Самое длинное окно бюджета
70 +
71 +Для каждого дня известна стоимость покупок. Найдите максимальную длину непрерывного отрезка дней, на котором суммарная стоимость не превосходит бюджета `B`. Все стоимости неотрицательны.
72 +
73 +**Ввод:** `N B` (`1 ≤ N ≤ 2·10^5`, `0 ≤ B ≤ 10^18`), затем `N` чисел `a_i` (`0 ≤ a_i ≤ 10^9`).
74 +
75 +**Вывод:** максимальная длина подходящего отрезка. Пустой отрезок допустим, поэтому ответ может быть `0`.
76 +
77 +**Пример:**
78 +```text
79 +6 7
80 +2 1 3 2 1 4
81 +```
82 +```text
83 +4
84 +```
85 +
86 +**Требование:** `O(N)` времени и `O(1)` дополнительной памяти после чтения входных значений.
87 +
88 +---
89 +
90 +[⬅️ К материалу по массивам](README.md)
Показать разницуСкрыть разницу
@@ -0,0 +1,91 @@
1 +# 🔴 Senior — массивы
2 +
3 +Задачи требуют сочетать алгоритмическую идею с контролем памяти и переполнений. Во всех задачах оптимизируйте дополнительную память, но не теряйте корректность.
4 +
5 +## 1. Потоковый медианный фильтр
6 +
7 +Датчик выдаёт `N` целых измерений. Для каждого окна из `K` соседних значений выведите медиану: элемент с индексом `floor((K-1)/2)` в отсортированном окне (при чётном `K` берётся нижняя медиана). Нельзя сортировать каждое окно заново.
8 +
9 +**Ввод:** `N K` (`1 ≤ K ≤ N ≤ 2·10^5`), затем `N` значений `a_i` (`|a_i| ≤ 10^9`).
10 +
11 +**Вывод:** `N-K+1` медиан в порядке окон.
12 +
13 +**Пример:**
14 +```text
15 +7 3
16 +1 3 -1 -3 5 3 6
17 +```
18 +```text
19 +1 -1 -1 3 5
20 +```
21 +
22 +**Требование:** не хуже `O(N log K)` времени. Обоснуйте память выбранной структуры; устаревшие элементы не должны бесконтрольно накапливаться.
23 +
24 +## 2. Частоты без таблицы
25 +
26 +Массив содержит `N` целых чисел из диапазона `[0, N-1]`. Преобразуйте его на месте так, чтобы в позиции `i` оказалось количество исходных значений, равных `i`. Выведите итоговый массив. Дополнительный массив и контейнеры запрещены.
27 +
28 +**Ввод:** `N` (`1 ≤ N ≤ 2·10^5`), затем `N` целых чисел `a_i` (`0 ≤ a_i < N`).
29 +
30 +**Вывод:** `N` частот в порядке значений от `0` до `N-1`.
31 +
32 +**Пример:**
33 +```text
34 +7
35 +1 2 1 0 2 1 4
36 +```
37 +```text
38 +1 3 2 0 1 0 0
39 +```
40 +
41 +**Требование:** `O(N)` времени и `O(1)` дополнительной памяти. Можно использовать значения самого массива для кодирования, но аккуратно восстановите результат. Тип элементов позволяет хранить промежуточные значения до `N*N`.
42 +
43 +## 3. Кольцевой буфер событий
44 +
45 +Реализуйте массив фиксированной вместимости `C`, который хранит последние события. Изначально буфер пуст. Поступают `Q` команд двух видов: `1 x` — добавить событие `x`, удалив самое старое, если буфер уже полон; `2` — вывести все события от самого старого к самому новому. Для пустого буфера команда вывода печатает `EMPTY`.
46 +
47 +**Ввод:** `C Q` (`1 ≤ C ≤ 2·10^5`, `1 ≤ Q ≤ 2·10^5`), далее команды. Значения `x` по модулю не превосходят `10^9`.
48 +
49 +**Вывод:** для каждой команды типа `2` выведите строку с элементами буфера в порядке времени либо `EMPTY`.
50 +
51 +**Пример:**
52 +```text
53 +3 6
54 +1 10
55 +1 20
56 +1 30
57 +1 40
58 +2
59 +2
60 +```
61 +```text
62 +20 30 40
63 +20 30 40
64 +```
65 +
66 +**Требование:** храните элементы в одном массиве размера `C`; добавление должно работать за `O(1)`. Команда вывода занимает время, пропорциональное числу выведенных элементов. Не перемещайте все элементы при каждом добавлении.
67 +
68 +## 4. Минимальная стоимость слияния блоков
69 +
70 +Есть `N` отсортированных массивов. Объединение двух массивов длины `x` и `y` стоит `x+y` операций и создаёт новый массив этой длины. Найдите минимальную суммарную стоимость объединения всех массивов. Ответьте также, сколько элементов памяти достаточно держать одновременно при стратегии, объединяющей две самые короткие последовательности и освобождающей их после слияния. Для ответа о памяти выведите максимум суммарных длин живых массивов, считая входные массивы и результат каждого объединения, но не учитывая уже освобождённые массивы.
71 +
72 +**Ввод:** `N` (`1 ≤ N ≤ 2·10^5`), затем `N` длин `L_i` (`1 ≤ L_i ≤ 10^9`). Суммарная длина может превышать 32-битный диапазон.
73 +
74 +**Вывод:** минимальная суммарная стоимость и пиковое число одновременно хранимых элементов при описанной стратегии.
75 +
76 +**Пример:**
77 +```text
78 +3
79 +2 3 5
80 +```
81 +```text
82 +15 15
83 +```
84 +
85 +**Пояснение:** сначала объединяются длины `2` и `3`, стоимость `5`; затем длины `5` и `5`, стоимость `10`. Пиковая память при первом слиянии — `2+3+5=10`, при втором — `5+5+10=20`, значит пример должен учитывать входные последовательности, оставшиеся живыми: исходные блоки освобождаются сразу после каждого слияния. Для однозначного подсчёта считайте, что перед слиянием входные два буфера и новый буфер одновременно существуют, а все прочие текущие буферы тоже остаются живыми.
86 +
87 +**Требование:** реализуйте жадную стратегию с очередью с приоритетом, не моделируя содержимое элементов. Используйте 64-битные целые. Внимательно формализуйте пик памяти для каждой операции.
88 +
89 +---
90 +
91 +[⬅️ К материалу по массивам](README.md)