Добавить оставшиеся Middle и Senior задачи по массивам
Родитель:
a8f57e3
· сравнить с родителем
2 файла
-
Показать разницуСкрыть разницу
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) -
Показать разницуСкрыть разницу
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)