графы

144 задачи
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.

Ферма Джона представлена двумерной решеткой пастбищ, каждое из которых содедржит тарву одного из видов (обозначаемых левойц и правой скобками): Например, так: (()) )()( )((( )))) Когда Беси бредет по ферме, ей требуется A единиц времени, чтобы перейти на соседнее пастбище (на север юг, запад или восток) с таким типом травы и B единиц времени, чтобы перейти на соседнее пастбище с другим типом травы. Когда Беси нужно перейти с одного пастбища на другое, она выбирает маршрут, который займет минимальное количество времени. Определите наибольшее количество времени которое потребуется Беси, для перехода между некоторой парой пастбищ фермы.
PROBLEM NAME: distant
Формат входных данных
* Строка 1: Три целых числа: N (1 <= N <= 30), A (0 <= A <= 1,000,000), и B (0 <= B <= 1,000,000).
* Строки 1..N+1: Каждая строка содержит строку скобок длиной N Вместе эти N строк формируют N x N решетку пастбищ.
Формат выходных данных
· Line 1: Одно целое число - максимальное количество времени, которое потребуется Беси между парой пастбищ (Беси всегла выбирает маршрут с минимальным количеством времени)
Примечание
5 единиц времени потребуется Беси чтобы добраться из левого верхнего угла в правый нижний угол решетки. Никакой другой маршрут не займет больше времени.

У Фермера Джона N (1 <= N <= 100) ферм. Они расположены на 2D-плоскости в позициях (xi,yi), различных для всех ферм, xi и yi - целые числа.
ФД нуждается в Вашей помощи для планирования развозки материалов на N ферм. Начиная с фермы 1 он планирует посещать фермы последовательно (ферма 1, ферма 2, ферма 3, :) и после посещения фермы N вернуться на ферму 1. ФД требуется одна минута, чтобы сделать один шаг на север, юг, восток или запад. Кроме того, ФД хочет посетить каждую ферму ровно 1 раз во время путешествия (конечно, кроме фермы 1, которую он посетит дважды).
Помогите ФД определить минимальное количество времени, которое у него займет весь маршрут.
PROBLEM NAME: delivery
Формат входных данных
* Строка 1: Количество ферм, N.
* Строки 2..1+N: Строка i+1 содержит два разделенных пробелом целых числа, xi yi (1 <= xi, yi <= 1,000,000).
Формат выходных данных
* Строка 1: Минимальное количество времени, которое требуется ФД, чтобы совершить свой путь или -1, если невозможно построить такой путь, чтобы каждую ферму (кроме фермы 1) посетить ровно 1 раз.
Примечание
ФД может совершить свой путь за 12 минут: 2 минут от фермы 1 к ферме 2, 5 минут от фермы 2 к ферме 3 (обходя ферму 1), 3 минуты от фермы 3 к ферме 4, 2 минуты вернуться к ферме 1.

Беси и ее бычок решили соединить свои фермы дорожками, чтобы сформировать союз против фермеров. Коровы в каждой из N (1 <= N <= 100,000) ферм были изначально проинструктированы, чтобы построить одну дорожку ровно к одной другой ферме. Всего получилось N дорожек. Однако через несколько месяцев после начала проекта реально построены были только M (1 <= M < N) дорожек. Беси хочет узнать, сколькими способами могли быть построены эти M дорожек. Например, если между фермами 3 и 4 есть дорожка, Один способ, что ее построила ферма 3, другой - что ферма 4.
Помогите Беси посчитать количество способов назначения к дорожкам построивших их ферм по модулю 1 000 000 007. Два назначения рассматриваются как различные, если хоть одна дорожка построена разными фермами в этих двух назначениях.
PROBLEM NAME: alliance
Формат входных данных
* Строка 1: Два разделенных пробелами целых числа N и M
* Строки 2..1+M: Строка i+1 описывает i-ую дорожку. Каждая строка содержит два разделенных пробелом целых числа ui vi (1 <= ui, vi <= N, ui != vi), описывающих пару ферм, соединенных дорожкой.
Формат выходных данных
* Строка 1: Одна строка, содержащая число назначений дорожек фермам, взятое по модулю 1,000,000,007. Если не существует назначений, удовлетворяющих заданным условиям, выведите 0.
Примечание
Всего существует 6 возможных назначений. Обозначение {a,b,c,d} означает, что ферма 1 построила дорожку a, Ферма 2 построила дорожку b, ферма 3 построила дорожку c, а ферма 4 построила дорожку d. Эти 6 назначений таковы: {2, 3, 4, 5} {2, 3, 5, 4} {1, 3, 4, 5} {1, 3, 5, 4} {1, 2, 4, 5} {1, 2, 5, 4}

Фермер Джон переезжает. Он хочет найти лучшее место для новой фермы, так чтобы минимизировать расстояние, которое он будет покрывать каждый день.
Регион, в который ФД планирует переехать, имеет N городов (1 <= N <= 10,000). Там имеется M двунаправленных дорог (1 <= M <= 50,000), соединяющих определенные пары городов. Все города достижимы друг для друга через некоторую комбинацию дорог. Требуется выбрать город, в котором поселится ФД.
В K (1 <= K <= 5) из этих городов имеется рынки, которые ФД планирует посещать каждый день. А именно, каждый день ФД планирует выехать со своей новой фермы, посетить все K городов с рынками и вернутся домой. ФД может посещать рынки в произвольном порядке. Город для совей новой фермы он обязательно должен выбрать в одном Из N-K городов, которые не имеют рынка (цена проживания там существенно ниже).
Пожалуйста, помогите ФД вычислить минимальное расстояние, которое он будет ежедневное проезжать, если он выберет наилучший город и наилучший маршрут.
PROBLEM NAME: relocate
Формат входных данных
* Строка 1: Три разделенных пробелом целых числа, N, M, K.
* Строки 2..1+K: Строка i+1 содержит целое число в диапазоне 1...N Указывающее город, содержащий i-ый рынок. Все рынки находятся в различных городах.
* Строки 2+K..1+K+M: Каждая строка содержит 3 разделенных одиночными пробелами целых числа, i, j (1 <= i,j <= N), L (1 <= L <= 1000), указывающих наличие дороги длиной L между городами I и J.
Формат выходных данных
* Строка 1: Минимальное расстояние, которое ФД будет проезжать каждый день, если он выберет город для проживания оптимально и спланирует маршрут движения оптимально.


Примечание
ФД построит ферму в городе 5. Его ежедневный маршрут будет таким: 5-1-2-3-2-1-5, общий путь равен 12.


Фермер Джон заметил, что его коровы часто перемещаются между соседними полями. Теперь он хочет посадить на каждом поле травы столько, чтобы хватало не только корове, изначально расположенной на этом поле, но и для тех коров, которые приходят сюда с соседних полей.
Ферма Джона состоит из N полей (1 <= N <= 100,000), некоторые из которых соединены двунаправленными дорожками (N-1 всего). Между любыми двумя полями I и j имеется уникальный путь по дорожкам. На поле I изначально пасется C(i) коров. Коровы могут переходить на соседние поля, используя не более чем K дорожек (1 <= K <= 20).
Фермер Джон хочет посадить на каждом поле травы столько, чтобы прокормить максимальное количество коров M(i) – это максимальное количество коров, которые потенциально могут перейти на поле I, используя не более чем K дорожек. По заданной структуре фермы и количеству коров C(i) на каждом поле I помогите ФД вычислить M(i) для каждого поля.
PROBLEM NAME: nearcows
Формат входных данных
* Строка 1: Два разделенных пробелом целых числа, N K.
* Строки 2..N:Каждая строка содержит два разделенных пробелом целых числа, I j (1 <= i,j <= N), указывающих, что поля I и j связаны непосредственной дорожкой.
* Строки N+1..2N: Строка N+i содержит целое число C(i). (0 <= C(i) <=1000)
Формат выходных данных
* Строка 1..N: Строка i должна содержать целое значение M(i).
Примечание
Для поля 1 M(1) = 15 коров на расстоянии не более чем 2 дорожки, и т.д.

После посещения музея современного искусства, ФД решил переупорядочить его ферму перемещением всех его N (1 <= N <= 1000) изгородей между пастбищами. Каждая изгородь - отрезок на 2D-плоскости. Если две изгороди встречаются, то они делают это только в своих конечных точках. Каждая изгородь касается ровно двух других изгородей по одной на каждой из своих конечных точек.

У ФД имеется C (1 <= C <= 1000) коров. Каждая корова находится на ферме и не в изгороди. Кроме того, никакие две коровы не находятся в одной точке. Две коровы называются принадлежащими одному и тому же сообществу, если они могут пройти одна к другой, не касаясь никаких изгородей.
Пожалуйста, помогите ФД определить размер самого большого сообщества.
PROBLEM NAME: crazy
Формат входных данных
* Строка 1: Два разделенных пробелом целых числа, N и C.
* Строки 2..1+N: Каждая строка содержит 4 целых числа x1, y1, x2, y2. Эти числа описывают изгородь из точки (x1,y1) в точку (x2,y2). Все координаты в диапазоне 0 .. 1,000,000.
* Строки 2+N..1+N+C: Каждая строка содержит два целых числа x и y, описывающих корову в позиции (x,y). Все координаты в диапазоне 0 .. 1,000,000.

Формат выходных данных
* Строка 1: Количество коров в самом большом сообществе.
Примечание
Коровы #2 и #4 принадлежат одному и тому же сообществу. Коровы #1 и #3 каждая являются членом сообщества размером 1

First!#89809

Беси опять играет со строками. Она обнаружила, что изменяя порядок алфавита она може добиться, чтобы некоторая строка стала лексикографически раньше всех.
Например, среди строк
"omm", "moo", "mom", "ommnom"
она может сделать первой строку "mom", используя стандартный алфавит. и она может сделать первой строку "omm" используя алфавит "abcdefghijklonmpqrstuvwxyz". Однако Беси не знает как сделать первым слово "moo" или "ommnom"
Помогите Беси вычислить строки из ввода, которые можно сделать первыми изменив порядок букв в алфавите.
Чтобы определить, что строка X лексикографически раньше cтроки Y найдите индекс первого символа в котором они различаются j. Если такого индекса нет, тогда X лексикографически меньше чем Y, если X короче чем Y, иначе, X лексикографически раньше чем Y, если X[j] находится в алфавите раньше чем Y[j].

PROBLEM NAME: first
Формат входных данных
* Строка 1: целое N (1 <= N <= 30,000),количество строк, с которыми играет Беси
* Строки 2..1+N: Каждая строка содержит не пустую строку символов. Общее количество символов во всех строках не превысит 300,000. Все символы на вводе - маленькие латинские буквы от 'a' до 'z'. Во вводе нет повторяющихся строк.

Формат выходных данных
* Строка 1: одно число K, количество строк, которые могут быть лексикографически первыми.
* Строки 2..1+K: (1+i)-ая строка должна содержать i-ую строку, которая может быть лексикографически первой. Строки нужны выводить в том же порядке, в котором они следовали на вводе.
Примечание
Только "omm" и "mom" могут стать первыми.


После посещения музея современного искусства, ФД решил переупорядочить его ферму перемещением всех его N (1 <= N <= 500) изгородей между пастбищами. Каждая изгородь - горизонтальный или вертикальный отрезок на 2D-плоскости. Если две изгороди встречаются, то они делают это только в своих конечных точках.
У ФД имеется C (1 <= C <= 500) коров. Каждая корова находится на ферме и не в изгороди. Кроме того, никакие две коровы не находятся в одной точке. Две коровы называются принадлежащими одному и тому же сообществу, если они могут пройти одна к другой, не касаясь никаких изгородей.
Пожалуйста, помогите ФД определить размер самого большого сообщества.
PROBLEM NAME: crazy
Формат входных данных
* Строка 1: Два разделенных пробелом целых числа, N и C.
* Строки 2..1+N: Каждая строка содержит 4 целых числа x1, y1, x2, y2. Эти числа описывают изгородь из точки (x1,y1) в точку (x2,y2). Каждая изгородь или вертикальна (x1=x2) или горизонтальна (y1=y2). Все координаты в диапазоне 0 .. 1,000,000.
* Строки 2+N..1+N+C: Каждая строка содержит два целых числа x и y, описывающих корову в позиции (x,y). Все координаты в диапазоне 0 .. 1,000,000.
Формат выходных данных
* Строка 1: Количество коров в самом большом сообществе.
Примечание
Коровы #1 и #2 принадлежат одному и тому же сообществу, поскольку они могут навестить друг друга, не касаясь никаких изгородей. Корова #3 не может посетить корову #1 или корову #2 не перелезая через изгородь.
Problem 3: Cow Steeplechase [Brian Dean]
Фермер Джон хочет провести коровьий стипль-чез (бег по кругу с препятствиями).
ФД сделал диаграмму всех N (1 <= N <= 250) препятствий, которые он может построить. Каждое препятствие представляет собой горизонтальный или вертикальный отрезок на 2D-плоскости (соответственно, параллельный горизонтальной или вертикальной оси).
Препятствие i имеет различные конечные точки (X1i, Y1i) и (X2i,Y2i) (1 <= X1i, Y1i, X2i, Y2i <= 1,000,000,000).
Например такие:
--+------- -----+----- ---+--- | | | | --+-----+--+- | | | | | | | --+--+--+-+- | | | | |
ФД хочет построить как можно больше таких препятствий при условии, что никакие два из них не пересекаются.
Для диаграммы приведенной выше, ответ – 7.
---------- ----------- ------- | | | | | | | | | | | | | | | | | | |
Для заданной диаграммы определите максимальное количество препятствий, которое может быть построено.
PROBLEM NAME: steeple
Формат входных данных
* Строка 1: Одно целое число: N.
* Строки 2..N+1: Строка i+1 содержит 4 разделенных пробелом целых числа, представляющих препятствие: X1i, Y1i, X2i, and Y2i.
Формат выходных данных
* Строка 1: Максимальное количество не пересекающихся отрезков
Примечание
Оптимальное решение – взять два вертикальных отрезка.
Roadblock#89794

Каждое утро Фермер Джон идет от дома к амбару. Ферма представляет собой множество из N полей (1 <= N <= 100) (дом на поле 1, амбар на поле N), соединенных M (1 <= M <= 10,000) двунаправленными дорогами, с каждой из которых ассоциирована длина.
Никакие два поля не соединены более чем одной дорогой, и существует маршрут дорог от любого поля к любому. Когда ФД идет от одного поля к другому, он всегда выбирает маршрут, состоящий из последовательности дорог, которые дают минимальную суммарную длину.
Коровы решили сделать ФД маленькую неприятность, выложив сено на одной из M дорог, тем самым удваивая ее длину.
Коровы хотят выбрать такую дорожку, чтобы максимально увеличить расстояние, которое ФД пройдет от дома до амбара. Помогите коровам определить, насколько они удлинят маршрут ФД.
PROBLEM NAME: rblock
Формат входных данных
* Строка 1: Два разделенных пробелом целых числа, N (1 <= N <= 100) и M (1 <= M <= 10,000).
* Строки 2..1+M: Строка j+1 описывает j-ую двунаправленную дорожку тремя разделенными пробелами целыми числами Aj Bj Lj, где Aj и Bj это числа от 1 до N, указывающие поля, соединенные этой Дорогой, а Lj - длина этой дороги (в диапазоне 1...1,000,000).
Формат выходных данных
* Строка 1: Максимально возможное увеличение общей длины кратчайшего маршрута, которого можно добиться удвоением длины одной дороги.
Примечание
Если коровы удвоят длину дороги от поля 3 к полю 4 (от 3 до 6), тогда кратчайшим маршрутом станет путь 1-3-5, с общей длиной 1+7= 8. Что на 2 больше, чем исходный кратчайший маршрут.
Проверьте, является ли данный JSON корректным деревом решений.

Дерево корректно, если:
  • Есть узел с id=0 (корень)
  • Все ссылки left_child и right_child указывают на существующие узлы
  • Нет циклов (каждый узел кроме корня имеет ровно одного родителя)
  • Все листья достижимы из корня

Формат входных данных
JSON с предполагаемым деревом решений.

Формат выходных данных
VALID если дерево корректно, иначе INVALID

 

Подземный бункер состоит из \(n\) комнат, соединённых \(n - 1\) коридорами. Каждый коридор соединяет две различные комнаты и имеет определённую длину. Бункер устроен таким образом, что из любой комнаты \(i\) можно дойти в любую другую комнату \(j\). Заметим, что существует единственный такой путь, не проходящий по одному и тому же коридору дважды. Сумма длин коридоров, составляющих этот путь, называется расстоянием между комнатами \(i\) и \(j\) и обозначается \(\rho(i, j)\).

Каждая комната бункера оборудована звуковой сигнализацией, состоящей из сирены и датчика звука, который её включает. Сирена, включённая в комнате \(i\), активирует датчик звука в каждой комнате, расстояние до которой не превосходит расстояние \(d_i\), определяемое мощностью этой сирены. Другими словами, включение сирены в комнате \(i\) автоматически включает сирену во всех комнатах \(j\), таких что \(\rho(i, j) \leq d_i\). Эта сирена, в свою очередь, может вызвать автоматическое включение других сирен и так далее.

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

Требуется написать программу, которая определяет минимальное количество сирен в наборе, удовлетворяющем правилам безопасности.

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

Первая строка входных данных содержит единственное число \(n\) — количество комнат.

Вторая строка содержит последовательность из \(n\) целых чисел \(d_i\), \(i\)-е из них равно максимальному расстоянию, на котором расположенная в комнате \(i\) сирена активирует датчики (\(0 \leq d_i \leq 10^9\)).

Последующие \(n - 1\) строк описывают коридоры бункера. В \(i\)-й из них находятся три целых числа: \(u_i\), \(v_i\), \(l_i\), где \(u_i\), \(v_i\) — номера различных комнат, соединённых коридором \(i\), а \(l_i\) — длина этого коридора (\(1 \leq u_i, v_i \leq n\); \(1 \leq l_i \leq 10^9\)).

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

Замечание
В тесте из примера сирена в комнате 4 включает сирену в комнате 5, которая, в свою очередь, включает сирены в комнатах 6 и 7. Сирена в комнате 2 включает сирену в комнате 3. Сирена в комнате 8 включает сирены в комнатах 1, 9 и 10.

Со стародавних времён в поморских деревнях рукодельницы вышивали жемчугом на прямоугольных полотенцах, состоящих из одинаковых клеток. Вышивка начиналась с пришивания жемчужины к полотенцу в центре одной из клеток. Чтобы пришить новую жемчужину, рукодельница делала стежок из клетки, уже содержащей жемчужину, в соседнюю с ней по горизонтали или вертикали свободную клетку. Новая жемчужина пришивалась в центре клетки на конце стежка. Этот процесс повторялся, пока не заканчивались жемчужины.

Одно из таких праздничных полотенец находится в музее. К сожалению, некоторые части узора были утеряны, но описание полотенца сохранилось. Дирекция музея планирует восстановить один из прямоугольных фрагментов полотенца, но не ещё не решила какой именно. Затраты на восстановление фрагмента зависят от количества связных частей узора, попавших на этот фрагмент. Часть узора считается связной, если от любой её жемчужины можно по стежкам перейти к любой другой её жемчужине, не выходя за границы фрагмента. Дирекция всегда относит любые две жемчужины, между которыми можно перейти по стежкам, к одной и той же связной части узора.

Требуется написать программу, вычисляющую количество связных частей узора для каждого из заданных фрагментов.

Входные данные
Первая строка входных данных содержит два целых числа \(a\) и \(b\) — размеры полотенца в клетках по горизонтали и вертикали.

Вторая строка содержит два числа \(n\) и \(q\) — количество жемчужин в узоре и количество фрагментов соответственно.

Следующие \((n - 1)\) строк содержат описания стежков. Каждый стежок имеет один из следующих видов:

  • h \(x~y\) означает, что клетки с координатами \((x, y)\) и \((x + 1, y)\) содержат жемчужины, соединённые горизонтальным стежком (\(1 \leq x \leq a - 1\); \(1 \leq y \leq b\));
  • v \(x~y\) означает, что клетки с координатами \((x, y)\) и \((x, y + 1)\) содержат жемчужины, соединённые вертикальным стежком (\(1 \leq x \leq a\); \(1 \leq y \leq b - 1\)).

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

Следующие \(q\) строк описывают фрагменты. Каждое описание содержит четыре целых числа \(x_1\), \(y_1\), \(x_2\) и \(y_2\) — координаты левой нижней и правой верхней клетки фрагмента (\(1 \leq x_1 \leq x_2 \leq a\); \(1 \leq y_1 \leq y_2 \leq b\)).

Выходные данные
Выходные данные должны содержать \(q\) строк, где \(i\)-я строка содержит количество связных частей узора в \(i\)-м фрагменте.

Замечание
Пояснение к тесту из условия.

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

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

Разрешается в некоторых квадратах построить водостоки. Когда на каком-то квадрате строят водосток, то вся вода, которая раньше скапливалась в этом квадрате, будет утекать в водосток.

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

Требуется определить, какое минимальное количество водостоков нужно построить, чтобы после дождя вся вода утекала в водостоки.

Входные данные
В первой строке записаны числа N и M, задающие размеры карты — натуральные числа, не превышающие 100. Далее идет N строк, по M чисел в каждой, задающих высоту квадратов карты над уровнем моря. Высота задается натуральным числом, не превышающим 10000. Считается, что квадраты, расположенные за пределами карты, имеют высоту 10001 (то есть вода никогда не утекает за пределы карты).

Выходные данные
Выведите минимальное количество водостоков, которое необходимо построить.
На полигоне, на котором проводятся военные учения сухопутных войск Флатландии, вырыты n окопов. Каждый окоп вырыт вдоль границы прямоугольника со сторонами, параллельными направлениям север–юг и запад–восток. При этом окопы могут иметь общие точки, но никакие два окопа не имеют общего участка ненулевой длины.

Очередные учения должны продемонстрировать способность солдат быстро и незаметно перемещаться из точки A в точку B.

Во время учений солдаты могут перемещаться либо по окопам, либо по траншеям, которые они могут прокапывать между окопами. При этом по окопам и выкопанным траншеям солдат может бегать настолько быстро, что временем перемещения от одной точки до другой можно пренебречь (будем считать его равным нулю). Траншеи же солдат копает со скоростью 1 метр в час.

Заданы точки A и B. Требуется определить, за какое минимальное время солдат во время учений сможет переместиться из А в B. Шириной траншей и окопов можно пренебречь.

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

Первая строка содержит число n — количество окопов на полигоне (1 ≤ n ≤ 500). Введем систему координат на полигоне таким образом, чтобы ось OX была ориентирована с запада на восток, а ось OY — с юга на север. Следующие n строк описывают окопы, каждый окоп описывается четырьмя целыми числами x1, y1, x2, y2 — координатами юго-западного и северо-восточного углов, соответственно (–104 ≤ x1 < x1 ≤ 104, –104 ≤ y1 < y2 ≤ 104).

Последние две строки содержат по два целых числа: xA, yA — координаты точки A и xB, yB — координаты точки B, соответственно (–104 ≤ xA, yA, xB, yB ≤ 104). Гарантируется, что точки A и B находятся в окопах. Все координаты заданы в метрах.

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

Выведите одно вещественное число — количество часов, которое потребуется солдату, чтобы добраться из точки A до точки B. Ответ должен отличаться от правильного не более чем на 10-6.
Город Мехико расположен в прекрасной долине, известной как Долина Мехико, на месте которой много лет назад было озеро. Около 1300 года ацтекские религиозные лидеры выпустили указ о том, что центр озера должен быть засыпан, чтобы построить столицу их империи. В настоящее время озеро полностью осушено.

Вокруг озера до появления ацтеков были расположены c прибрежных городов. Некоторые из этих городов заключили между собой коммерческие соглашения. Между городами, установившими коммерческие соглашения, по озеру на лодках перевозились различные товары. Любую пару городов можно было соединить отрезком прямой, полностью проходящим через озеро.

В какой-то момент короли городов решили упорядочить товароперевозки. Они разработали маршрут товароперевозок, который соединяет все города вокруг озера. Маршрут удовлетворяет следующим условиям:

*Он начинается в каком-либо городе, проходит через каждый прибрежный город и заканчивается в городе, отличном от того, в котором он начался.
*Маршрут проходит через каждый город ровно один раз.
*Любые два последовательно посещаемых города маршрута обязаны иметь между собой коммерческое соглашение.
*Маршрут состоит из отрезков прямых, каждый из которых соединяет два последовательно посещаемых города маршрута.
*Чтобы избежать столкновения лодок, маршрут не должен иметь самопересечений.



На рисунке показано озеро и города вокруг него. Тонкие и жирные линии отрезков обозначают коммерческие соглашения между городами. Жирные линии показывают маршрут грузоперевозок, начинающийся в городе 2 и заканчивающийся в городе 5.

Этот маршрут нигде не имеет самопересечений. Но если построить маршрут, идущий из города 2 в город 6, затем в город 5, а затем в город 1, то он будет неправильным, поскольку имеет самопересечения.

Города нумеруются целыми числами от 1 до c по направлению часовой стрелки.
Задание
Напишите программу, которая по заданному числу городов c и списку коммерческих соглашений между городами, найдет маршрут товароперевозок, удовлетворяющий указанным выше условиям.

Ограничения
3 ≤ c ≤ 1000, c – число городов вокруг озера

Входные данные
На вход Вашей программы поступают данные в следующем формате:

СТРОКА 1: Содержит целое число c.
СТРОКА 2: Содержит целое число n – количество коммерческих соглашений.
СЛЕДУЮЩИЕ n СТРОК: Каждая строка описывает одно коммерческое соглашение (одно соглашение описывается один раз). В строке задаются два целых числа, разделенных пробелами, которые соответствуют номерам городов, заключивших между собой коммерческое соглашение.

Выходные данные
Если возможно построить маршрут товароперевозок, выведите c строк, в каждой из которых записано целое число. Эти числа представляют собой порядок посещения городов по маршруту товароперевозок. Если невозможно построить маршрут товароперевозок, удовлетворяющий всем указанным требованиям, выведите одну строку, содержащую отрицательное целое число -1.

Замечание
Если существует несколько маршрутов товароперевозок, удовлетворяющих всем указанным требованиям, выведите любой из них.
Два неориентированных графа G и H называются изоморфными , если:
  • они имеют одинаковое количество вершин;
  • существует такое однозначное соответствие между их вершинами, что любые две различные вершины графа G соединены ребром тогда и только тогда, когда соединены ребром соответствующие вершины графа H.
Например, следующие два графа изоморфны, хотя выглядят по-разному:


 

Возможным однозначным соответствием, показывающим, что эти два графа изоморфны, является {a-1, b-6, c-8, d-3, g-5, h-2, i-4, j-7}, хотя существуют и другие подобные соответствия.

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



Говорят, что граф G содержит другой граф H , если существует хотя бы один подграф H ’ графа G , который изоморфен H . Следующий рисунок показывает граф G , который содержит граф H .



ЗАДАНИЕ

По двум заданным неориентированным графам G и H постройте подграф G’ графа G такой, что:

количество вершин в графах G и G’ одинаково;
H не содержится в G’ .
Естественно, может быть много подграфов графа G’ с перечисленными свойствами. Постройте подграф с как можно большим количеством ребер.

БАЗОВЫЙ АЛГОРИТМ

Возможно, наиболее простой стратегией при решении этой задачи будет следующая: рассматривать ребра графа G в порядке, в котором они представлены во входных данных, после чего пытаться добавлять ребра одно за другим в граф G’, проверяя на каждом шаге, входит ли граф H в граф G’ или нет. Правильная реализация этого жадного алгоритма наберет некоторое количество очков, хотя существуют гораздо лучшие стратегии.

ОГРАНИЧЕНИЯ

3 ≤ m ≤ 4    m – количество вершин в H.
3 ≤ n ≤ 1000    n – количество вершин в G .

ВВОД

Вы получите 10 тестов каждый со следующими данными:
 

Пример ввода

ОПИСАНИЕ

3 5
0 1 0
1 0 1
0 1 0
0 1 0 0 0
1 0 1 0 0
0 1 0 1 0
0 0 1 0 1
0 0 0 1 0

СТРОКА 1: Содержит два целых числа, разделенных пробелом, соответственно и n.

СЛЕДУЮЩИЕ СТРОККаждая строка содержит целых чисел, разделенных пробелами, и представляет одну вершину из в порядке 1, ..., -ый элемент -ой строки в этой секции равняется 1, если вершины и соединены ребром в , и равняется 0 в противном случае.

СЛЕДУЮЩИЕ СТРОК Каждая строка содержит целых чисел, разделенных пробелами, и представляет одну вершину из в порядке 1, ..., -ый элемент -ой строки в этой секции равняется 1, если вершины и соединены ребром в и равняется 0 в противном случае.

 

Заметьте, что за исключением строки 1, приведенные входные данные представляют собой матрицы смежности графов и .

ВЫВОД

Вы должны создать 10 выводов по одному на каждый входной. Каждый тест должен содержать следующие данные:

Пример вывода

ОПИСАНИЕ

#FILE forbidden K
5
0 1 0 0 0
1 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

СТРОКА 1: Заголовок файла. Заголовок файла должен содержать

#FILE forbidden K

где K – это число между 1 и 10, которое соответствует решенному входному файлу.

СТРОКА 2: Содержит одно целое число : .

СЛЕДУЮЩИЕ СТРОК Каждая строка содержит целых чисел, разделенных пробелом, и представляет одну вершину из G’ в порядке 1, ..., -ый элемент -ой строки в этой секции равняется 1, если вершины и соединены ребром в G’ , и равняется 0 в противном случае.

Заметьте, что за исключением строк 1 и 2, приведенные входные данные представляют собой матрицу смежности графа G’. Обратите внимание, что есть много вариантов ответа, и приведенный вариант является корректным, но не оптимальным.

Планируется строительство новой магистрали <<Урал>>. Долговечность автомагистрали зависит от пластов пород, залегающих под ней. Пластом называется геологическое тело, состоящее из одной горной породы.

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

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

image

Требуется написать программу, которая определяет возможный порядок залегания пластов по глубине, не противоречащий полученным данным.

Формат входных данных
Первая строка входного файла содержит целое число \(n\) "— количество пластов. Пласты пронумерованы целыми числами от \(1\) до \(n\) в произвольном порядке.

В \(i\)-й из следующих \(n\) строк содержатся целые числа \(l_i\) и \(r_i\) (\(0 \leqslant l_i < r_i\leqslant 10^9\)) "— расстояния от начала магистрали до точек, под которыми начинается и заканчивается \(i\)-й пласт.

В следующей строке записано целое число \(m\) "— количество скважин, в которых проводилось бурение. Следующие \(m\) строк описывают результаты бурения: в каждой строке сначала указаны два целых числа \(x\) (\(0 \leqslant x \leqslant 10^9\)) и \(k\) (\(0 \leqslant k \leqslant n\)) "— расстояние от начала магистрали до скважины и количество обнаруженных в данной скважине пластов, затем "— целые числа \(s_1, s_2, \ldots, s_k\) "— номера пробуренных пластов, перечисленные в порядке залегания сверху вниз. Скважины перечислены в порядке возрастания расстояния \(x\).

Гарантируется, что решение существует.

Формат выходных данных
Первая строка выходного файла должна содержать \(n\) целых чисел \(p_1, p_2, \ldots , p_n\), описывающих возможный порядок залегания пластов сверху вниз. Среди чисел \(p_1, p_2, \ldots , p_n\) каждый номер пласта должен встретиться ровно один раз. При этом пласт с номером \(p_j\) не должен нигде проходить выше пластов с номерами \(p_1, \ldots ,p_{j-1}\) или ниже пластов с номерами \(p_{j+1}, \ldots , p_n\).

Если возможных расположений пластов несколько, выведите любое из них.

Примечание
Рисунок в условии соответствует примеру. Для приведенного примера правильным также является ответ 2 3 1 4. Обратите внимание, что тест из примера не соответствует подзадаче 1. Для того, чтобы решение было принято на проверку, оно должно проходить тест из примера, даже если решена только эта подзадача.

Коллайдер — это установка для изучения столкновений элементарных частиц. При его работе частицы разгоняются до большой скорости. Специальный детектор позволяет фиксировать траектории частиц в виде прямых на горизонтальной плоскости.

На детектор сверху направлена сверхскоростная камера на вращающемся в горизонтальной плоскости креплении. Ориентация камеры в каждый момент времени задаётся направляющей прямой. Камера может сфотографировать произвольную прямоугольную область, одна из сторон которой параллельна заданной направляющей прямой.

Для анализа потенциальных столкновений частиц важно, чтобы на каждом фотоснимке были отображены все точки пересечений их траекторий. Камера использует очень дорогие расходные материалы, поэтому площадь каждого фотоснимка необходимо минимизировать.

Требуется написать программу, которая по хронологической последовательности событий двух типов:

  • появление новой траектории частицы,

  • получение фотоснимка камерой, ориентированной по заданной направляющей прямой,

определит для каждого фотоснимка минимальную площадь прямоугольной области, включающей все точки пересечения траекторий частиц, появившихся до этого снимка.

Формат входных данных
В первой строке задано одно целое число \(n\) (\(1 \leqslant n \leqslant 200\,000\)) — общее количество событий. В следующих \(n\) строках заданы описания событий.

Описание каждого события состоит из пяти элементов. Первый элемент является символом <<+>>, если это событие является появлением новой траектории, или символом <<?>>, если это событие является получением фотоснимка. Последующие четыре элемента — целые числа \(x_1\), \(y_1\), \(x_2\), \(y_2\) (\(-10\,000 \leqslant x_1, y_1, x_2, y_2 \leqslant 10\,000\)) — координаты двух несовпадающих точек. Для событий первого типа указанные точки лежат на траектории частицы. Все траектории различны. Для событий второго типа указанные точки лежат на направляющей прямой камеры.

Формат выходных данных
Пусть \(q\) — количество полученных фотоснимков. Выходной файл должен содержать \(q\) вещественных чисел — минимальные возможные площади фотоснимков, перечисленные в порядке их получения камерой. Тест будет успешно пройден, если для каждой из \(q\) выведенных площадей выполняется условие \(\frac{|a - b|}{\max(1, b)} \leqslant 10^{-4}\), где \(a\) — площадь, выведенная участником, \(b\) — площадь, полученная решением жюри.

Примеры
Входные данные Выходные данные Иллюстрация
1 6
+ 0 0 0 1
+ 0 0 1 0
+ 1 0 0 2
? 0 0 0 1
+ 2 4 3 6
? 0 0 1 1
2.0
3.000
2 7
? 11 4 -7 8
+ -2 -2 1 1
? 0 0 0 1
+ 0 1 1 0
+ 0 2 2 0
? 0 0 0 1
? 0 0 1 1
 
0.0
0.0
0.25
0.0000000
 

Робинзон живет на острове, который представляет собой прямоугольник размером \(n \times m\) клеток.

На остров Робинзона выползли погреться на солнышке и задремали несколько крокодилов. Робинзон хочет прогнать неприятных соседей, не поднимая шума. Для этого он кидает в дремлющих крокодилов орехи.

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

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

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

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

Формат входных данных
В первой строке записаны числа \(n\) и \(m\) "— размеры острова с севера на юг и с запада на восток. Последующие \(n\) строк по \(m\) символов в каждой описывают текущее расположение крокодилов на острове. Если клетка свободна, то она обозначается точкой <<.>>, а если там находится крокодил, то в ней указано направление, в котором побежит этот крокодил. Направления обозначаются буквами: <<N>> "— север, <<S>> "— юг, <<E>> "— восток, <<W>> "— запад.

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


Пояснение к третьему примеру

Поделиться
Класснуть