Школа 179, московские сборы по информатике, усложнённая номинация 12 ноября 2006 Задача A. Internet Имя входного файла: Имя выходного файла: Максимальное время работы на одном тесте: Максимальный объем используемой памяти: internet.in internet.out 2 секунды 64 мегабайта В связи с организацией московских сборов-2179, было решено соединить серверы всех школ города гигабайтной сетью. Конфигурация сети должна удовлетворять двум требованиям: во-первых, должна быть возможность передачи данных из каждой школы в каждую (возможно, не напрямую, а через серверы других школ), а во-вторых, чтобы не было лишних участков сети – то есть, чтобы не существовало участков сети, после ликвидации которых первое требование продолжает выполняться. Руководство города выделило финансирование, исходя только из предполагаемой длины сети, то есть, готово заплатить фиксированную сумму за каждый метр расстояния между двумя соединенными участком сети школами. Естественно, организаторы сборов хотят минимизировать себестоимость одного метра сети. Вам поручено сделать проект сети, учитывающий пожелания организаторов. Формат входных данных В первой строке входного файла находятся числа 1<=N<=1000 – количество школ и 1<=M<=100000– количество пар школ, между которыми технически возможно проложить кабель. В следующих M стоках идет описание каждой пары: через пробел выписаны номера школ, которые можно соединить, расстояние между ними в метрах и себестоимость прокладки кабеля. Себестоимость и расстояние – натуральные числа от 1 до 1000000. Можно считать, что какую-то сеть, удовлетворяющую описанным требованиям, всегда можно проложить. Формат выходных данных Вывести минимальную среднюю стоимость одного метра сети с точностью до 10-8. Средняя стоимость одного метра равна отношению суммарной себестоимости к суммарной длине сети. Примеры internet.in 3 1 1 2 3 1 1 2 3 2 3 3 3 2 3 3 internet.out 1.00000000 50 60 100 100 100 100 2.00000000 1000 3000 1 5 1000 1997 Страница 14 из 4 Школа 179, московские сборы по информатике, усложнённая номинация 12 ноября 2006 Задача B. Cactus Имя входного файла: Имя выходного файла: Максимальное время работы на одном тесте: Максимальный объем используемой памяти: cactus.in cactus.out 2 секунды 64 мегабайта Кактусом называется связный неориентированный граф, в котором каждое ребро лежит максимум на одном простом цикле. Интуитивно, кактус это дерево, в котором разрешены некоторые циклы. Важным отличием кактуса от дерева является то, что у него могут быть подграфы, которые сами являются кактусами. Количество таких подграфов называется кактусовостью (кактусовость обычного дерева равна единице). Положим кактусовость графа, не являющегося кактусом равной 0. В этой задаче вам надо найти кактусовость заданного графа. Формат входных данных Первая строка входного файла содержит два числа: N и M. (1<=N<=20000, 0<=M<=1000). Здесь N обозначает количество вершин графа. Вершины занумерованы числами от 1 до N. Ребра графа заданы M путями, каждый из которых не проходит ни через одно ребро более чем один раз. Каждая из следующих M строк содержит описание пути. Описание пути начинается с числа ki – количества вершин данного пути. Далее следует ki целых чисел, соответствующих вершинам пути. Путь может проходить через одну вершину несколько раз, каждое ребро графа встречается только в одном пути. Формат выходных данных Выведите в выходной файл единственное число – кактусовость графа. Примеры cactus.in 14 3 9 1 2 3 4 5 6 7 8 3 7 2 9 10 11 12 13 10 2 2 14 10 2 7 1 2 3 4 5 6 1 6 3 7 8 9 10 2 5 1 4 1 2 3 4 cactus.out 35 0 0 Страница 24 из 4 Школа 179, московские сборы по информатике, усложнённая номинация 12 ноября 2006 Задача C. GunMan Имя входного файла: Имя выходного файла: Максимальное время работы на одном тесте: Максимальный объем используемой памяти: gunman.in gunman.out 2 секунды 64 мегабайта Рассмотрим систему координат OXYZ. Задано N прямоугольных рекламных щитов. Плоскость каждого щита параллельна OXY, а стороны параллельны осям OX и OY. При этом никакие два щита не лежат в одной плоскости. Человек, возненавидевший рекламу, движется по оси OX. У него есть пистолет и одна пуля (после выстрела пуля летит по прямой). Он хочет сбить все щиты (щит считается сбитым, если он имеет общую точку с траекторией полета пули). Ваша задача – найти подходящий выстрел или установить, что его не существует. Формат входных данных В первой строке входного файла задано целое число 2<=N<=100 – количество рекламных щитов. Следующие N строк описывают щиты. Каждое описание содержит пять целых чисел x1i, y1i, x2i, y2i, zi (все от 0 до 1000). (x1i, y1i, zi) и (x2i, y2i, zi) – координаты противоположных углов щита, x1i<x2i, y1i<y2i. Все щиты упорядочены по z: zi>zi-1 для 1<i<=N. Формат выходных данных Если такой выстрел невозможен, выведите просто cлово UNSOLVABLE. Иначе, в первой строке выведите слово SOLUTION. Во второй строке выведите координату x, из которой нужно стрелять. В каждой из следующих N строк выведите по три числа xi, yi, zi – координаты точки i-го щита, через которую пройдет пуля. Все координаты в выходном файле должны быть выведены с точностью до шести цифр после десятичной точки. Примеры gunman.in 3 1 3 5 5 3 1 2 5 7 5 5 2 7 6 6 gunman.out SOLUTION -1.000000 2.000000 3.000000 3.000000 4.000000 5.000000 5.000000 5.000000 6.000000 6.000000 Страница 34 из 4 Школа 179, московские сборы по информатике, усложнённая номинация 12 ноября 2006 Задача D. HeapSort Имя входного файла: Имя выходного файла: Максимальное время работы на одном тесте: Максимальный объем используемой памяти: heapsort.in heapsort.out 2 секунды 64 мегабайта Опишем алгоритм сортировки массива различных чисел с помощью кучи. Алгоритм состоит из двух фаз. В первой фазе мы сделаем из массива кучу. Массив из N различных чисел a[1…N] будем называть кучей, если: 1) Если 2*i<=N, то a[i]>a[2*i] 2) Если 2*i+1<=N, то a[i]>a[2*i+1] Мы можем представить массив, как бинарное дерево, считая, что дети элемента a[i] – a[2*i] и a[2*i+1]. В этом случае, отец элемента a[i] – элемент a[i div 2]. В этих терминах, куча – это дерево, у которого дети каждой вершины меньше, чем их предок. Во второй фазе мы делаем из кучи отсортированный массив. Ясно, что в куче наибольший элемент это a[1]. Поменяем местами a[1] и a[N] – теперь наибольший элемент находится на корректной позиции отсортированного массива. Будем называть эту операцию extract-max. Теперь рассмотрим подмассив a[1…N-1]. Это может оказаться не кучей, так как свойство кучи может на выполняться для i=1. Если это так (то есть a[2] или a[3] или оба превосходят a[1]), то переставим элемент a[1] с наибольшим из своих детей, восстановив тем самым свойство кучи для i=1. Теперь свойство кучи может не выполняться лишь для элемента, куда мы поместили a[1]. Если это так, то проделаем аналогичную операцию с ним. Повторяя эту операцию, мы добьемся того, чтобы подмассив a[1…N-1] стал кучей. Эту процедуру будем называть sifting down. После того, как мы получим кучу a[1…N-1], опять можно применить процедуру extract-max и т. д. Например, покажем как куча (5, 4, 2, 1, 3) превращается в отсортированный массив. После первой операции extract-max, массив станет таким: (3, 4, 2, 1, 5). Свойство кучи не выполнено для элемента a[1]=3, так как элемент a[2]=4, поэтому поменяем a[1] и a[2]. Получим массив (4, 3, 2, 1, 5). На этом sifting down заканчивается. Теперь применим extract-max: (1, 3, 2, 4, 5). Свойство кучи опять не выполнено для a[1]=1. После sifting down (всего будет один обмен a[1] и a[2]), получим массив (3, 1, 2, 4, 5). После применения extract-max, получим на этот раз кучу: (2, 1, 3, 4, 5). Далее, применив два раза extract-max, получим отсортированный массив: (1, 2, 3, 4, 5). Нетрудно доказать, что первую фазу можно проделать за O(N) операций, а вторую за O(N*logN) операций. В этой задаче вам нужно найти массив длины N, являющийся кучей, состоящий из из чисел 1…N, такой что на второй фазе количество операций обмена максимально из возможных. В приведенном примере это количество равно 1+1+0+0+0=2, что не максимально. Массив (5, 4, 3, 2, 1) дает максимальное количество для N=5. Формат входных данных Входной файл содержит число 1<=N<=50000. Формат выходных данных Выведите массив, при котором достигается максимум. Элементы массива разделите пробелом. Примеры heapsort.in 6 heapsort.out 6 5 3 2 4 1 Страница 44 из 4