Добавить оставшиеся Middle и Senior задачи по массивам #6
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) | ||