Skip to content

Files

Latest commit

c9873fa · Feb 7, 2023

History

History

Sort, heap, binsearch

Сортировки, куча, бинпоиск

A. Простая сортировка

Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 64 мегабайта

В этой задаче вам нужно реализовать любую из пройденных сортировок, работающих за время O ( n log n ) . Использовать встроенные в язык сортировки и структуры данных запрещается.

Дан массив целых чисел. Ваша задача — отсортировать его в порядке неубывания.

Входные данные

В первой строке содержится число n ( 1 n 100   000 ) — количество элементов в массиве. Во второй строке находятся n целых чисел, по модулю не превосходящих 10 9 .

Выходные данные

Выведите этот же массив в порядке неубывания.

Пример

Входные данные

10
1 8 2 1 4 7 3 2 3 6

Выходные данные

1 1 2 2 3 3 4 6 7 8

B. Сортировка подсчетом

Ограничение по времени на тест: 1 секунда
Ограничение по памяти на тест: 64 мегабайта

А в этой задаче вам нужно реализовать сортировку подсчетом. Использовать другие сортировки запрещается.

Дан массив из n элементов, которые принимают целые значения от 0 до 100. Отсортируйте этот массив в порядке неубывания элементов.

Входные данные

В первой строке содержится число n ( 1 n 200   000 ) — количество элементов в массиве. Во второй строке находятся n целых чисел, от 0 до 100 каждое.

Выходные данные

Выведите отсортированный массив.

Пример

Входные данные

5
7 3 4 2 5

Выходные данные

2 3 4 5 7

C. Количество инверсий

Ограничение по времени на тест: 5 секунд
Ограничение по памяти на тест: 256 мегабайт

Напишите программу, которая для заданного массива A = a 1 , a 2 , , a n находит количество пар ( i , j ) таких, что i < j и a i > a j .

Входные данные

Первая строка входного файла содержит натуральное число n ( 1 n 500   000 ) — количество элементов массива. Вторая строка содержит n попарно различных элементов массива A ( 0 a i 10 6 ) .

Выходные данные

В выходной файл выведите одно число — ответ на задачу.

Пример

Входные данные

4
1 2 4 5

Выходные данные

0

Входные данные

4
5 4 2 1

Выходные данные

6

D. Хипуй!

Ограничение по времени на тест: 3 секунды
Ограничение по памяти на тест: 256 мегабайт

В этой задаче вам необходимо организовать структуру данных Heap для хранения целых чисел, над которой определены следующие операции:

  • Insert(X) — добавить в Heap число X ;
  • Extract — достать из Heap наибольшее число (удалив его при этом).

Эту задачу нужно решить без использования встроенных структур данных для поиска максимального числа.

Входные данные

Во входном файле записано количество команд n ( 1 n 100   000 ) , потом последовательность из n команд, каждая в своей строке.

Каждая команда имеет такой формат: 0 <число> или 1, что означает соответственно операции Insert(<число>) и Extract. Добавляемые числа находятся в интервале от 1 до 10 7 включительно.

Гарантируется, что при выполнении команды Extract в структуре находится по крайней мере один элемент.

Выходные данные

В выходной файл для каждой команды извлечения необходимо вывести число, полученное при выполнении команды Extract.

Пример

Входные данные

7
0 100
0 10
1
0 5
0 30
0 50
1

Выходные данные

100
50

E. Быстрый поиск в массиве

Ограничение по времени на тест: 1 секунда
Ограничение по памяти на тест: 512 мегабайт

Дан массив из n целых чисел. Все числа от 10 9 до 10 9 .

Нужно уметь отвечать на запросы вида «Cколько чисел имеют значения от l до r »?

Входные данные

Число n ( 1 n 10 5 ). Далее n целых чисел.

Затем число запросов k ( 1 k 10 5 ) .

Далее k пар чисел l , r ( 10 9 l r 10 9 ) — собственно запросы.

Выходные данные

Выведите k чисел — ответы на запросы.

Пример

Входные данные

5
10 1 10 3 4
4
1 10
2 9
3 4
2 2

Выходные данные

5 2 2 0

F. Приближенный двоичный поиск

Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 256 мегабайт

Даны два массива. Первый массив отсортирован по неубыванию, второй массив содержит запросы — целые числа.

Для каждого запроса выведите число из первого массива наиболее близкое (то есть с минимальным модулем разности) к числу в этом запросе. Если таких несколько, выведите меньшее из них.

Входные данные

В первой строке входных данных содержатся числа n и k ( 0 < n , k 10 5 ) . Во второй строке задаются n чисел первого массива, отсортированного по неубыванию, а в третьей строке — k чисел второго массива. Каждое число в обоих массивах по модулю не превосходит 2 10 9 .

Выходные данные

Для каждого из k чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному. Если таких несколько, выведите меньшее из них.

Пример

Входные данные

5 5
1 3 5 7 9
2 4 8 1 6

Выходные данные

1
3
7
1
5

G. Очень Легкая Задача

Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 256 мегабайт

Сегодня утром жюри решило добавить в вариант олимпиады еще одну, Очень Легкую Задачу. Ответственный секретарь Оргкомитета напечатал ее условие в одном экземпляре, и теперь ему нужно до начала олимпиады успеть сделать еще n копий. В его распоряжении имеются два ксерокса, один из которых копирует лист за x секунд, а другой — за y . (Разрешается использовать как один ксерокс, так и оба одновременно. Можно копировать не только с оригинала, но и с копии.) Помогите ему выяснить, какое минимальное время для этого потребуется.

Входные данные

На вход программы поступают три натуральных числа n , x и y , разделенные пробелом ( 1 n 2 10 8 , 1 x , y 10 ) .

Выходные данные

Выведите одно число — минимальное время в секундах, необходимое для получения n копий.

Пример

Входные данные

4 1 1

Выходные данные

3

Входные данные

5 1 2

Выходные данные

4

H. Квадратный корень и квадратный квадрат

Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 256 мегабайт

Найдите такое число x , что x 2 + x , с точностью не менее 6 знаков после точки.

Входные данные

В единственной строке содержится вещественное число 1.0 C 10 10 .

Выходные данные

Выведите одно число — искомый x .

Пример

Входные данные

2.0000000000

Выходные данные

1.0

Входные данные

18.0000000000

Выходные данные

4.0

I. Поляна дров

Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 256 мегабайт

Маленький мальчик Ферма́ живет в деревне. Наступают холодные времена, поэтому бабушка попросила мальчика сходить в лес, чтобы собрать дров. В лесу около деревни, в которой живет Ферма, находится волшебная Поляна Дров, на которой всегда лежат дрова, и никогда не кончаются. Естественно, Ферма должен пойти именно туда.

Единственная проблема заключается в том, что идти до Поляны не очень близко, тем более что скорость передвижения по лесу намного меньше, чем скорость передвижения по полю, в котором находится деревня.

  • Деревня находится в точке с координатами ( 0 , 1 ) .
  • Поляна находится в точке с координатами ( 1 , 0 ) .
  • Граница между лесом и полем — горизонтальная прямая y = a , где a — некоторое число ( 0 a 1 ) .
  • Скорость передвижения по полю составляет V p , скорость передвижения по лесу — V f . Вдоль границы можно двигаться как по лесу, так и по полю.

Найдите точку, в которой мальчик Ферма должен войти в лес, чтобы дойти до Поляны Дров как можно быстрее.

Входные данные

В первой строке входного файла содержатся два положительных целых числа — V p и V f ( 1 V p , V f 10 5 ) . Во второй строке содержится единственное вещественное число — координата по оси O y границы между лесом и полем a ( 0 a 1 )

Выходные данные

В единственной строке выходного файла выведите вещественное число с точностью не менее 4 знаков после запятой — координата по оси O x точки, в которой мальчик Ферма должен войти в лес.

Пример

Входные данные

5 3
0.4

Выходные данные

0.783310604

J. K-best

Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 256 мегабайт

У Демьяны есть n драгоценностей. Каждая из драгоценностей имеет ценность v i и вес w i . С тех пор, как её мужа Джонни уволили в связи с последним финансовым кризисом, Демьяна решила продать несколько драгоценностей. Для себя она решила оставить лишь k лучших. Лучших в смысле максимизации достаточно специфического выражения: пусть она оставила для себя драгоценности номер i 1 , i 2 , , i k , тогда максимальной должна быть величина

j = 1 k v i j j = 1 k w i j

Помогите Демьяне выбрать k драгоценностей требуемым образом.

Входные данные

На первой строке n и k ( 1 k n 100   000 ) .

Следующие n строк содержат пары целых чисел v i , w i ( 0 v i 10 6 , 1 w i 10 6 ) , сумма всех v i не превосходит 10 7 , сумма всех w i также не превосходит 10 7 ) .

Выходные данные

Выведите k различных чисел от 1 до n — номера драгоценностей. Драгоценности нумеруются в том порядке, в котором перечислены во входных данных. Если есть несколько оптимальных ответов, выведите любой.

Пример

Входные данные

3 2
1 1
1 2
1 3

Выходные данные

1
2

K. Разделение массива

Ограничение по времени на тест: 1 секунда
Ограничение по памяти на тест: 256 мегабайт

Дан массив из n положительных целых чисел. Нужно разбить его на k отрезков так, чтобы максимальная сумма на отрезке была минимально возможной.

Входные данные

Первая строка содержит целые числа n и k ( 1 k n 10 5 ) . Вторая строка содержит элементы массива a i ( 1 a i 10 9 ) .

Выходные данные

Выведите одно число — минимально возможную максимальную сумму на отрезке.

Пример

Входные данные

10 4
1 3 2 4 10 8 4 2 5 3

Выходные данные

12

L. Таблица умножения

Ограничение по времени на тест: 1 секунда
Ограничение по памяти на тест: 256 мегабайт

Петя составил таблицу умножения размера n × n . Ячейка в i -й строке и j -м столбце содержит значение i j . Петю заинтересовал вопрос: какое число в таблице является k -м по возрастанию? Помогите Пете ответить на этот вопрос.

Входные данные

Ввод содержит два целых числа n и k ( 1 n 10 5 , 1 k n 2 ) .

Выходные данные

Выведите одно число — k -е число по возрастанию в таблице.

Пример

Входные данные

3 4

Выходные данные

3

Входные данные

5 16

Выходные данные

10

M. K-я сумма

Ограничение по времени на тест: 1 секунда
Ограничение по памяти на тест: 256 мегабайт

Есть два массива a и b , каждый из которых состоит из n чисел. Для каждой пары чисел ( i , j ) : 1 i , j n выпишем сумму чисел a i + b j . Найдите в полученном множестве сумм k -ю по возрастанию.

Входные данные

Первая строка содержит целые числа n и k ( 1 n 10 5 , 1 k n 2 ) . Вторая строка содержит элементы массива a , третья строка содержит элементы массива b . Все элементы массивов — целые положительные числа, не больше 10 9 .

Выходные данные

Выведите одно число — искомая k -я сумма.

Пример

Входные данные

5 10
4 2 6 4 8
7 3 1 9 5

Выходные данные

9