Добавить Senior-задачи по массивам #8
1 файл изменён
+94
Войди, чтобы оставлять замечания к строкам.
Показать разницуСкрыть разницу
| @@ -0,0 +1,94 @@ | |||
| 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`: это может вызвать лишние перемещения и не гарантирует точный размер буфера. | ||