Кружок обучения мастерству программирования при СПбГУ, группа B2 Первое занятие: сортировка, пятница, 1 октября 2010 года Задача A. Сортировка небольшой последовательности Имя входного файла: bubble.in Имя выходного файла: bubble.out Ограничение по времени: 2 секунды Ограничение по памяти: 256 Мебибайт В этой задаче нужно отсортировать числа, заданные во входном файле. Формат входных данных В первой строке входного файла задано целое число n (1 6 n 6 5 000). Во второй строке заданы через пробел n целых чисел a1 , a2 , . . ., an (1 6 ai 6 109 ). Формат выходных данных В первой строке выходного файла выведите через пробел n чисел — числа ai в неубывающем порядке. Примеры bubble.in 3 1 2 3 4 3 2 2 1 5 10 100 10 1000 10 bubble.out 1 2 3 1 2 2 3 10 10 10 100 1000 Задача B. Количество инверсий такой последовательности требуется оценить среднее значение ее членов. В разных случаях под средним значением понимают разные числа: мы можем вычислить среднее арифметическое, а можем посчитать, какое число в отсортированной последовательности будет посередине. Медианой последовательности называется число, которое может разбить все числа последовательности на два множества: числа в первом множестве не больше медианы, а во втором — не меньше, и при этом мощности множеств равны (то есть в них одинаковое количество элементов). Например, медиана последовательности {1, 2, 7, 5, 3} — это 3. Когда в последовательности нечетное количество членов, медиана определяется однозначно — это тот член последовательности, который находится на равном расстоянии от концов последовательности. В случае, когда в последовательности четное количество членов, медианой могло бы служить любое число между двумя средними значениями в последовательности. Например, в последовательности {2, 2, 3, 10 000} медианой могло бы быть любое число из интервала (2, 3). Для определенности в случае четного количества членов медианой считается среднее арифметическое двух средних значений. Ваша задача — для данной последовательности целых чисел вывести ее медиану. Формат входных данных В первой строке входного файла задано целое число n (1 6 n 6 5 000). Во второй строке заданы через пробел n целых чисел a1 , a2 , . . ., an (1 6 ai 6 109 ). Имя входного файла: inverse.in Имя выходного файла: inverse.out Ограничение по времени: 2 секунды Ограничение по памяти: 256 Мебибайт Напишите программу, которая для заданного массива A = ha1 , a2 , . . . , an i находит количество пар (i, j) таких, что i < j и ai > aj . Формат выходных данных Формат входных данных Примеры Первая строка входного файла содержит натуральное число n (1 6 n 6 50 000) — количество элементов массива. Вторая строка содержит n попарно различных элементов массива A. Формат выходных данных В выходной файл выведите одно число — ответ на задачу. Примеры inverse.in 4 1 2 4 5 4 5 4 2 1 В первой строке выходного файла выведите единственное вещественное число — медиану последовательности с точностью до шести знаков после запятой. median.in 5 1 2 5 7 3 4 2 2 3 10000 5 10 100 10 1000 10 median.out 3 2.5 10 Задача D. Минимаксное преобразование inverse.out 0 6 Задача C. Медиана последовательности Имя входного файла: median.in Имя выходного файла: median.out Ограничение по времени: 2 секунды Ограничение по памяти: 256 Мебибайт В теории вероятностей и статистике часто рассматриваются конечные последовательности чисел. Иногда для Имя входного файла: minimax.in Имя выходного файла: minimax.out Ограничение по времени: 2 секунды Ограничение по памяти: 256 Мебибайт Рассмотрим набор чисел a1 , a2 , . . ., an . Минимаксным преобразованием этого набора по модулю p назовём следующую операцию: найдём минимум amin и максимум amax в наборе, удалим их из него, а вместо них добавим число (amin + amax ) mod p. Дан набор из n чисел. Над ним последовательно n − 1 раз производят минимаксное преобразование. Выведите те числа, которые были добавлены в набор, в порядке их добавления. Страница 1 из 4 Кружок обучения мастерству программирования при СПбГУ, группа B2 Первое занятие: сортировка, пятница, 1 октября 2010 года Формат входных данных Примеры Набор чисел задан генератором. В первой строке входного файла заданы через пробел три целых числа n, b и p (2 6 n 6 100 000, 1 6 b < p 6 109 ). Числа исходного набора получаются как ai = bi mod p. Формат выходных данных В первой строке выходного файла выведите n − 1 число — те числа, которые были добавлены в набор в результате минимаксных преобразований, в порядке их добавления. Примеры minimax.in 3 2 5 4 2 1000 minimax.out 1 4 18 22 30 3 1 1 2 4 4 3 2 3 orderstatistic.in 1 2 3 2 3 2 9 2 2 2 2 4 5 orderstatistic.out 1/2 1/3 1/1 9/4 9/2 1/2 1/2 1/2 Задача F. Устойчивая сортировка пар Имя входного файла: pairs.in Имя выходного файла: pairs.out Ограничение по времени: 2 секунды Имя входного файла: orderstatistic.in Ограничение по памяти: 256 Мебибайт Имя выходного файла: orderstatistic.out В этой задаче нужно отсортировать пары чисел, заданОграничение по времени: 2 секунды ных во входном файле. Зададим устойчивый порядок на Ограничение по памяти: 256 Мебибайт парах следующим образом. Пусть (ai , bi ) и (aj , bj ) — две В этой задаче требуется уметь быстро находить k-ю пары из исходной последовательности, i, j — номера этих порядковую статистику последовательности — то есть пар. элемент, который после сортировки этой последовательПара (ai , bi ) считается меньше пары (aj , bj ) в двух слуности по неубыванию будет стоять в ней на k-м месте. чаях: Есть две замкнутые в кольцо ленты, на каждой из которых записана последовательность чисел: числа a1 , a2 , 1. если ai < aj , . . ., an на первой ленте и числа b1 , b2 , . . ., bn на второй. 2. если ai = aj и i < j. Назовём p-м циклическим cдвигом положение, в котором a1 находится над bp+1 , a2 над bp+2 , . . ., an−p над bn , an−p+1 Таким образом, требуется отсортировать последованад b1 , . . ., an−1 над bp−1 и an над bp . Рассмотрим послетельность пар так, чтобы первые числа пар были расподовательность дробей ложены в неубывающем порядке, и при этом сортировка была устойчивой. a1 a2 an−p an−p+1 an−1 an , , ..., , , ..., , bp+1 bp+2 bn b1 bp−1 bp Формат входных данных Задача E. Порядковые статистики и обозначим k-ю порядковую статистику этой последова(p) тельности как sk . По данным числам на лентах, а также числу k, найдите (1) (2) (n) последовательность sk , sk , . . ., sk . Формат входных данных В первой строке входного файла задано целое число n (1 6 n 6 5 000). В следующих n строках заданы через пробел по два целых числа, ai и bi (1 6 ai , bi 6 109 ). Формат выходных данных В первых n строках выходного файла выведите пары чисел ai bi , разделенных пробелом, в требуемом порядке. В первой строке входного файла заданы через пробел два целых числа n и k — размер лент и номер порядко- Примеры pairs.in вой статистики (1 6 k 6 n 6 5000). Во второй строке 3 записаны n чисел a1 , a2 , . . ., an — содержимое ленты с 1 2 числителями (1 6 ai 6 109 ). В третьей строке записаны n 3 1 чисел b1 , b2 , . . ., bn — содержимое ленты со знаменателями 9 1 1 (1 6 bi 6 10 ). 4 Формат выходных данных 4 1 В первой строке выходного файла выведите n чисел че3 2 (1) (2) (n) рез пробел — k-е порядковые статистики sk , sk , . . ., sk . 2 2 Каждое число должно быть представлено в виде несокра3 3 тимой дроби. Страница 2 из 4 pairs.out 1 2 1 1 3 1 2 3 3 4 2 2 3 1 Кружок обучения мастерству программирования при СПбГУ, группа B2 Первое занятие: сортировка, пятница, 1 октября 2010 года Задача G. Сортировка различных Пример product.in чисел Имя входного файла: permut.in Имя выходного файла: permut.out Ограничение по времени: 2 секунды Ограничение по памяти: 256 Мебибайт В этой задаче нужно отсортировать последовательность натуральных чисел, заданных во входном файле, при условии, что числа в последовательности не повторяются, и максимальное из этих чисел не превосходит длины последовательности. Формат входных данных В первой строке входного файла задано натуральное число n (1 6 n 6 1 000 000). Во второй строке заданы через пробел n натуральных чисел a1 , a2 , . . ., an (1 6 ai 6 n). Формат выходных данных В первой строке выходного файла выведите через пробел n чисел — числа ai в неубывающем порядке. Пример permut.in 2 2 1 permut.out 1 2 2 3 1 3 -5 -2 4 1 5 1 2 3 4 5 1 0 1 0 1 product.out Case #1: -25 Case #2: 6 Задача I. Сортировка большой последовательности Имя входного файла: sort.in Имя выходного файла: sort.out Ограничение по времени: 2 секунды Ограничение по памяти: 256 Мебибайт В этой задаче нужно отсортировать числа, заданные во входном файле. Формат входных данных В первой строке входного файла задано целое число n (1 6 n 6 300 000). Во второй строке заданы через пробел n целых чисел a1 , a2 , . . ., an (1 6 ai 6 1000). Формат выходных данных Задача H. Скалярное произведение В первой строке выходного файла выведите через пробел n чисел — числа ai в неубывающем порядке. Примеры Имя входного файла: product.in Имя выходного файла: product.out Ограничение по времени: 2 секунды Ограничение по памяти: 256 мебибайт Дано два вектора: v1 = (x1 , x2 , . . . , xn ) и v2 = (y1 , y2 , . . . , yn ). Скалярным произведением этих векторов называется значение, вычисляемое по формуле: x1 y1 + x2 y2 + . . . + xn yn . Разрешено переставлять координаты каждого из векторов любым образом. Выберите такие их перестановки, чтобы скалярное произведение двух полученных векторов было минимальным и выведите его значение. 1 6 n 6 800. −100 000 6 xi , yi 6 100 000. sort.in 3 1 2 3 4 3 2 2 1 5 10 100 10 1000 10 sort.out 1 2 3 1 2 2 3 10 10 10 100 1000 Задача J. Ленивый работник Имя входного файла: worker.in Имя выходного файла: worker.out Ограничение по времени: 2 секунды Ограничение по памяти: 256 Мебибайт Формат входных данных Трактир «Не дай себе просохнуть!» взял на работу ноПервая строка входного файла содержит единственное вого работника — кладовщика. У кладовщика есть две целое число t — количество наборов тестовых данных. обязанности. Первая — принимать от грузчиков бочки с Далее следуют сами наборы, по три строки в каждом. пивом и закатывать их в подвал. Вторая — когда в бочПервая строка тестового набора содержит единственное ке у трактирщика не остаётся пива, выкатывать ему из целое число n. Две следуюшие строки содержат по n це- подвала новую бочку, в которой пиво ещё имеется. лых чисел, задающих координаты соответствующего векХитрый работник скоро понял, что в разных бочках, тора, каждая. попадающих к нему в подвал, содержится различное количество пива, и решил впредь всегда выкатывать тракФормат выходных данных Для каждого набора выведите строку с номером этого тирщику ту бочку, в которой пива менее всего, чтобы набора и ответом на задачу — значением минимального особо не напрягаться. Дальновидность не в характере скалярного произведения. Следуйте формату, указанно- лентяя-кладовщика, и то обстоятельство, что позднее ему придётся катать исключительно тяжёлые бочки, равно му в примере. как и то, что лёгкие бочки нужно катать чаще, он проигнорировал. При получении бочки от грузчиков кладовщик измеряет количество пива в ней. Количество пива обозначается целым числом от 0, когда бочка пуста, до 1000, когда вся Страница 3 из 4 Кружок обучения мастерству программирования при СПбГУ, группа B2 Первое занятие: сортировка, пятница, 1 октября 2010 года бочка заполнена пивом. Известно, что грузчики не пере- Примеры дают кладовщику пустых бочек. worker.in Трактирщик узнал о том, какую хитрость придумал 3 его новый ленивый работник, и теперь, зная количество 1 пива во всех привозимых грузчиками бочках, хочет вы2 яснить, сколько пива будет в каждой следующей бочке, 0 которую кладовщик выкатит из подвала. 5 По последовательности поступлений бочек в подвал и 3 выкатываний их трактирщику установите, сколько пива 0 было в каждой выкаченной бочке. 2 0 Формат входных данных 1 В первой строке входного файла задано число N (1 6 N 6 100 000). Следующие N строк содержат по од6 ному числу Ai в каждой и описывают события в порядке, 8 в котором они происходят. Если Ai больше нуля, то это 4 означает поступление в подвал новой бочки, количество 2 пива в которой равно Ai . Если же Ai равно нулю, то опи1 сываемое данной строкой событие — это выкатывание из 0 подвала бочки, пива в которой осталось менее всего. 0 Изначально можно считать, что в подвале бочек с пи4 вом нет. Гарантируется, что трактирщик не попадёт в си1 туацию, когда на его запрос кладовщик не может выка1 тить новой бочки. 1 0 Формат выходных данных 10 На каждое выкатывание бочки из подвала выведите 4 строку, состоящую из единственного числа Bj — сколько 3 пива содержалось в выкаченной бочке. 7 4 9 5 6 0 0 0 Страница 4 из 4 worker.out 1 3 2 1 2 1 3 4 4