1_3. Нужная сумма

Ограничение времени 0.05 секунд
Ограничение памяти 5Mb

Даны два строго возрастающих массива целых чисел A[0..n) и B[0..m) и число k. Найти количество таких пар индексов (i, j), что A[i] + B[j] = k.

Время работы O(n + m). n, m ≤ 100000.
Указание. Обходите массив B от конца к началу.

2_3. Пересечение множеств

Ограничение времени 1 секунда
Ограничение памяти 5Mb

Даны два массива неповторяющихся целых чисел, упорядоченные по возрастанию. A[0..n-1] и B[0..m-1]. n » m. Найдите их пересечение.

Требуемое время работы: O(m * log k), где k - позиция элементта B[m-1] в массиве A..

В процессе поиска очередного элемента B[i] в массиве A пользуйтесь результатом поиска элемента B[i-1]. n, k ≤ 10000.


3_1. Очередь с динамическим буфером

Ограничение времени 1 секунда
Ограничение памяти 10Mb

Реализовать очередь с динамическим зацикленным буфером. Обрабатывать команды push back и pop front.

Формат ввода

В первой строке количество команд n. n ≤ 1000000. Каждая команда задаётся как 2 целых числа: a b. a = 2 - pop front a = 3 - push back Если дана команда pop front, то число b - ожидаемое значение. Если команда pop front вызвана для пустой структуры данных, то ожидается “-1”.

Формат вывода

Требуется напечатать YES - если все ожидаемые значения совпали. Иначе, если хотя бы одно ожидание не оправдалось, то напечатать NO.


5_1. Реклама

Ограничение времени 0.05 секунд
Ограничение памяти 64Mb

В супермаркете решили оптимизировать показ рекламы. Известно расписание прихода и ухода покупателей (два целых числа). Каждому покупателю необходимо показать минимум 2 рекламы. Рекламу можно транслировать только в целочисленные моменты времени. Покупатель может видеть рекламу от момента прихода до момента ухода из магазина. В каждый момент времени может показываться только одна реклама. Считается, что реклама показывается мгновенно. Если реклама показывается в момент ухода или прихода, то считается, что посетитель успел её посмотреть. Требуется определить минимальное число показов рекламы.


6. Порядковая статистика

Ограничение времени 1 секунда
Ограничение памяти 16Mb

Даны неотрицательные целые числа n, k и массив целых чисел из диапазона [0..109] размера n. Требуется найти k-ю порядковую статистику. т.е. напечатать число, которое бы стояло на позиции с индексом k ∈[0..n-1] в отсортированном массиве. Напишите нерекурсивный алгоритм.

Требования к дополнительной памяти: O(n).
Требуемое среднее время работы: O(n).

Функцию Partition следует реализовывать методом прохода двумя итераторами в одном направлении. Описание для случая прохода от начала массива к концу:

Выбирается опорный элемент. Опорный элемент меняется с последним элементом массива. Во время работы Partition в начале массива содержатся элементы, не бОльшие опорного. Затем располагаются элементы, строго бОльшие опорного. В конце массива лежат нерассмотренные элементы. Последним элементом лежит опорный. Итератор (индекс) i указывает на начало группы элементов, строго бОльших опорного. Итератор j больше i, итератор j указывает на первый нерассмотренный элемент. Шаг алгоритма. Рассматривается элемент, на который указывает j. Если он больше опорного, то сдвигаем j. Если он не больше опорного, то меняем a[i] и a[j] местами, сдвигаем i и сдвигаем j. В конце работы алгоритма меняем опорный и элемент, на который указывает итератор i.


7_2. LSD для long long

Ограничение времени 1 секунда
Ограничение памяти 20Mb

Дан массив неотрицательных целых 64-битных чисел. Количество чисел не больше 1000000. Отсортировать массив методом поразрядной сортировки LSD по байтам.


Хеш-таблица

Ограничение времени 0.2 секунды
Ограничение памяти 15Mb

Реализуйте структуру данных типа “множество строк” на основе динамической хеш-таблицы с открытой адресацией. Хранимые строки непустые и состоят из строчных латинских букв. Хеш-функция строки должна быть реализована с помощью вычисления значения многочлена методом Горнера. Начальный размер таблицы должен быть равным 8-ми. Перехеширование выполняйте при добавлении элементов в случае, когда коэффициент заполнения таблицы достигает 3/4. Структура данных должна поддерживать операции добавления строки в множество, удаления строки из множества и проверки принадлежности данной строки множеству. Для разрешения коллизий используйте квадратичное пробирование. i-ая проба g(k, i)=g(k, i-1) + i (mod m). m - степень двойки.

Формат ввода

Каждая строка входных данных задает одну операцию над множеством. Запись операции состоит из типа операции и следующей за > ним через пробел строки, над которой проводится операция. Тип операции – один из трех символов:

  • '+' означает добавление данной строки в множество;
  • '-' означает удаление строки из множества;
  • ? означает проверку принадлежности данной строки множеству. При добавлении элемента в множество НЕ ГАРАНТИРУЕТСЯ, что он отсутствует в этом множестве. При удалении элемента из множества НЕ ГАРАНТИРУЕТСЯ, что он присутствует в этом множестве.

Формат вывода

Программа должна вывести для каждой операции одну из двух строк OK или FAIL, в зависимости от того, встречается ли данное > слово в нашем множестве.


Обход дерева в порядке in-order

Ограничение времени 0.2 секунды
Ограничение памяти 64Mb

Дано число N ≤ 104 и последовательность целых чисел из [-231..231] длиной N. Требуется построить бинарное дерево, заданное наивным порядком вставки. Т.е., при добавлении очередного числа K в дерево с корнем root, если root→Key ≤ K, то узел K добавляется в правое поддерево root; иначе в левое поддерево root. Выведите элементы в порядке in-order (слева направо). Рекурсия запрещена.