JustCaptain kod-buduschego

Добавить Senior-задачи по массивам #8

Слито JustCaptain слил(а) llm/senior-883e8c → main · fe80956
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`: это может вызвать лишние перемещения и не гарантирует точный размер буфера.