JustCaptain kod-buduschego

Merge branch 'llm/senior-883e8c' into 'main'

JustCaptain · 2 недели назад fe80956f3715cc5bb12053880d3a19c417fa9f37
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`: это может вызвать лишние перемещения и не гарантирует точный размер буфера.