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