графы

162 задачи
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.
Каждая из \(N\) (\(1\le N\le 2\cdot 10^5\)) коров Фермера Джона имеет любимый цвет. Коровы последовательно помечены \(1\ldots N\), а каждый цвет может быть представлен целым числом в интервале \(1\ldots N\).

Имеется \(M\) пар коров \((a,b)\) таких, что корова \(b\) восхищается коровой \(a\) (\(1\le M\le 2\cdot 10^5\)). Возможно, что \(a=b\), в этом случает корова восхищается сама собой. Для любого цвета \(c\), если коровы \(x\) и \(y\) обе восхищаются коровой с любимым цветом \(c\), тогда коровы \(x\) и \(y\) разделяют один и тот же любимый цвет.

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

ФОРМАТ ВВОДА (файл fcolor.in):

Первая строка содержит \(N\) и \(M\).

Каждая из последующих \(M\) строк содержит два разделённых пробелом целых числа \(a\) и \(b\) (\(1\le a,b\le N\)), обозначающих, что корова \(a\) восхищается коровой \(b\). Каждая пара может появится на вводе более одного раза.

ФОРМАТ ВЫВОДА (файл fcolor.out):

Для каждого \(i\) в интервале \(1\ldots N\), выведите на отдельной строке цвет коровы \(i\) в желаемом назначении.

Имеется \(N\) (\(2\le N\le 2\cdot 10^5\)) миров, каждый с порталом. Изначально, мир \(i\) (for \(1 \leq i \leq N\)) имеет \(x\)-координату \(i\), и \(y\)-координату \(A_i\) (\(1\le A_i\le 10^9\)). В каждом мире есть по одной корове. В момент времени \(0\), все \(y\)-координаты различны и все миры начинают падать. Мир \(i\) двигается непрерывно в отрицательном направлении координаты \(y\) со скоростью \(i\) единиц в секунду.

В любой момент времени, когда два мира находятся на одной и той же \(y\)-координате (возможно в дробное время), порталы "выравниваются". Это означает, что корова из одного из этих миров, может используя эти порталы мгновенно перебраться в другой мир.

Для каждого \(i\) корова из мира \(i\) хочет перебраться в мир \(Q_i\) (\(Q_i\neq i\)). Определите для каждой коровы, сколько времени ей понадобиться, чтобы перебраться в желаемый мир, если она будет путешествовать оптимально.

Ответ на каждый запрос необходимо вывести в виде дроби \(a/b\), где \(a\) и \(b\) положительные и взаимно простые целые числа. Выведите \(-1\) если путешествие невозможно.

ОЦЕНИВАНИЕ:

  • В тестах 2-3 \(N\le 100.\)
  • В тестах 4-5 \(N\le 2000.\)
  • В тестах 6-14 нет дополнительных ограничений.

ФОРМАТ ВВОДА (файл falling.in):

Первая строка ввода должна содержать одно целое число \(N.\)

Следующая строка содержит \(N\) разделённых одиночными пробелами целых числе \(A_1,A_2,\ldots,A_N.\)

Следующая строка содержит \(N\) разделённых одиночными пробелами целых чисел \(Q_1,Q_2,\ldots,Q_N.\)

ФОРМАТ ВЫВОДА (файл falling.out):

Выведите \(N\) строк, \(i\)-th из которых содержит длину пути для коровы \(i.\)

Беси находится на двумерной решетке, где движение разрешено только параллельно одной из осей координат. Она начинает в точке \((0,0)\) и хочет достичь точки \((N,N)\) (\(1\le N\le 10^9\)). Для помощи ей на решетке имеется \(P\) (\(1\le P\le 10^5\)) трамплинов. Каждый трамплин находится в фиксированной точке \((x_1,y_1)\) и если Беси использует его, она окажется в точке \((x_2,y_2)\).

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

ОЦЕНИВАНИЕ:

  • В тестах 2-5 \(P \le 1000\).
  • В тестах 6-15 нет дополнительных ограничений.

ФОРМАТ ВВОДА (файл boards.in):

Первая строка ввода содержит два разделённых пробелом целых числа \(N\) и \(P\).

Каждая из следующих \(P\) строк содержит четыре целых числа \(x_1\), \(y_1\), \(x_2\), \(y_2\), где \(x_1 \le x_2\) и \(y_1 \le y_2.\)

Все точки начала трамплинов и мест приземления различны.

ФОРМАТ ВЫВОДА (файл boards.out):

Выведите одно целое число, минимальное расстояние, которое Беси должна пройти чтобы достичь точки \((N,N)\).

Ферма Джона состоит из \(N\) пастбищ (\(1 \leq N \leq 10^5\)), соединённых \(N-1\) дорогой, так что любое пастбище достижимо из любого другого. То есть ферма представляет собой дерево.

ФД хочет разбить множество дорог на несколько путей. Его не беспокоит количество путей. Однако он хочет чтобы все эти пути максимально возможными.

Помогите ФД определить максимальное положительное целое \(K\) такое, что дороги могут быть разделены на пути длины не менее \(K\).

ОЦЕНИВАНИЕ:

  • В тестах 2-4 дерево формирует звезду; не более чем одна вершина имеет степень больше чем 2.
  • В тестах 5-8 \(N\le 10^3\).
  • В тестах 9-15 нет дополнительных ограничений.

ФОРМАТ ВВОДА (файл deleg.in):

Первая строка содержит \(N\).

Каждая из следующих \(N-1\) строк содержит по два целых числа \(a\) и \(b\), описывающих ребро между вершинами \(a\) и \(b\). Оба числа \(a\) и \(b\) в интервале \(1 \ldots N\).

ФОРМАТ ВЫВОДА (файл deleg.out):

Выведите \(K\).

Timeline#90098
Беси посетила \(N\) доек (\(1\le N\le 10^5\)) за последние \(M\) дней (\(2 \le M \le 10^9\)).

Для каждой дойки \(i = 1 \ldots N\), она знает, что та случилась не ранее дня \(S_i\) (\(1\le S_i\le M\)). Дополнительно, Беси имеет \(C\) заметок (\(1\le C\le 10^5\)), каждая описывается тройкой \((a,b,x)\), указывающей, что дойка \(b\) случилась как минимум через \(x\) дней после дойки \(a\).

Помогите Беси вычислить наиболее ранние возможные даты доек. Гарантируется, что все заметки Беси корректны, то есть существует решение (все числа в интервале \(1\ldots M\)), удовлетворяющее всем заметкам.

ОЦЕНИВАНИЕ:

  • В тестах 2-4 \(N,C \le 10^3\).
  • В тестах 5-10 нет дополнительных ограничений.

ФОРМАТ ВВОДА (файл timeline.in):

Первая строка ввода содержит \(N\), \(M\), \(C\).

Следующая строка содержит \(N\) разделённых одиночными пробелами целых чисел \(S_1,S_2,\ldots, S_N\). Каждое в интервале \(1 \ldots M\).

Следующие \(C\) строк содержат по три целых числа \(a\), \(b\), \(x\) указывающих, что дойка \(b\) случилась не менее чем через \(x\) дней после дойки \(a\). Для каждой строки, \(a \neq b\), \(a\) и \(b\) в интервале \(1 \ldots N\), а \(x\) в интервале 1 \ldots M$.

ФОРМАТ ВЫВОДА (файл timeline.out):

Выведите \(N\) строк, определяющих наиболее ранние возможные даты доек.

Ферма Фермера Джона состоит из \(N\) пастбищ (\(1 \leq N \leq 10^5\)) соединённых \(N-1\) дорогами, так, что любое пастбище достижимо из любого пастбища. То есть ферма представляет собой дерево.

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

Более точно для каждого \(1 \leq K \leq N-1\), помогите ФД определить, могут ли дороги быть распределены на пути длиной ровно \(K\).

ОЦЕНИВАНИЕ:

  • В тестах 2-4 дерево образовывает звезду; не более одной вершины имеет степень более двух.
  • В тестах 5-8 \(N\le 10^3\).
  • В тестах 9-15 нет дополнительных ограничений.

ФОРМАТ ВВОДА (файл deleg.in):

Первая строка содержит целое число \(N\).

Каждая из следующих \(N-1\) строк содержит целые числа \(a\) и \(b\), описывающие ребро между вершинами \(a\) и \(b\). Все \(a\) и \(b\) в интервале \(1 \ldots N\).

ФОРМАТ ВЫВОДА (файл deleg.out):

Выведите битовую строку длины \(N-1.\) Для каждого \(1\le K\le N-1,\) \(K\)-ый бит строки слева равный 1 означает, что возможно разбиение ребер на пути длины ровно \(K\) и равный \(0\) в противном случае.

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

Каждый час корова или

  • Останавливается, если трава в текущей ячейке уже съедена другой коровой.
  • Съедает всю траву в текущей ячейке и перемещается на одну ячейку вперёд в своём исходном направлении.

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

Если две коровы попадут одновременно на одну и ту же ячейку с травой, они поедят вместе и продолжат движение в своих направлениях в следующий час.

ФД не любит, когда корова прекращает пастись, и он хочет узнать, кто виноват в его остановленных коровах. Если корова \(b\) остановилась в ячейке, которую съела корова \(a\), тогда он считает, что корова \(a\) остановила корову \(b\). Более того, если корова \(a\) остановила корову \(b\), а корова \(b\) остановила корову \(c\), он считает, что корова \(a\) также остановила корову \(c\) (то есть отношение "остановила" транзитивно). Каждая корова "виновата" в количестве коров, которые она остановила. Для каждой коровы вычислите количество остановленных ею коров.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит целое число \(N\). Каждая из последующих \(N\) строк описывает стартовую позицию коровы в терминах: символ (N или E, смотри на север или на восток) и и два неотрицательных целых числа \(x\) and \(y\) (\(0\le x\le 10^9\), \(0\le y\le 10^9\)) - координаты ячейки. Все \(x\)-координаты различны. Все \(y\)-координаты различны.

Чтобы было понятнее относительно направлений и координат, если корова в ячейке \((x,y)\) и двигается на север, то она попадёт в ячейку \((x,y+1)\), а если на восток - то в ячейку \((x+1, y)\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите \(N\) строк. Строка \(i\) должна описывать количество коров, которые остановила \(i\)-ая по вводу корова.

Фермер Джон и его друзья фермеры борются с распространением COVID-19 среди своих коров.

Вместе они наблюдают за коллекцией из \(N\) ферм (\(1 \leq N \leq 10^5\)), последовательно пронумерованных \(1 \ldots N\). Эти фермы соединены множеством из \(N-1\) дорог так, что любая ферма достижима от фермы 1 некоторой последовательностью дорог.

К несчастью, одна корова на ферме 1 дала положительный тест на КОВИД-19. Никакие из других коров на этой и других фермах пока не больны. Однако, в связи с высокой контагенозностью этой болезни, ФД ожидает точно одно из следующих неблагоприятных событий каждый последующий день:

(1) На ферме количество коров с КОВИД-19 удваивается

(2) Одна корова с КОВИД-19 перемещается по дороге с одной фермы на соседнюю ферму.

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

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит одно целое число \(N\). Каждая из следующих \(N-1\) строк содержит два разделённых пробелом числа \(a\) и \(b\), описывающих дорогу между фермами \(a\) и \(b\). \(a\) и \(b\) в интервале \(1\ldots N\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Минимальное количество дней, чтобы болезнь достигла каждой фермы.

Фермер Джон сделал робота!

Ферма может быть представлена решёткой \(N\times N\) (\(3\le N\le 1000\)), где каждая ячейка решётки или пустая или заполнена скалой и все граничные ячейки заполнены скалой. Некоторые пустые ячейки определены как возможные стартовые позиции робота.

ФД изначально располагает робота на одной из возможных стартовых позиций. В каждый последующий час все копии робота как одна скоординированная масса двигаются в некотором направлении - на север, юг, запад или восток. После \(D\) часов (\(1 \leq D \leq 10^9\)), каждая копия робота реплицируется --- робот в ячейке \((x,y)\) который реплицируется, создаёт новые копии в ячейках \((x+1,y)\), \((x-1,y)\), \((x,y+1)\), \((x,y-1)\); оригинальный робот остаётся в ячейке \((x,y)\). После некоторого времени много роботов могут занять одну и ту же ячейку.

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

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

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит два разделённых пробелом целых числа \(N\) и \(D\). Каждая из следующих \(N\) строк содержит по \(N\) символов. Каждый символ - один из '.', 'S', '#'. '.' и 'S' представляют пустые ячейки, причём 'S' обозначает возможную стартовую позицию робота. '#' обозначает скалу.

Все символы в первой и последней строке, в первом и последнем столбце - '#'.

ФОРМАТ ВЫВОДА (на экран / stdout):

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

Недавно Фермер Джон увеличил размер своей фермы, теперь с точки зрения коров, она бесконечная по размеру. Коровы представляют пастбище фермы как бесконечную 2D решётку квадратных ячеек, каждая из которых заполнена вкуснейшей травой. (Думайте о каждой ячейке как о клетке на шахматной доске). Каждая из \(N\) коров (\(1\le N\le 50\)) ФД начинает в различной ячейке. Некоторые начинают, глядя на север, а некоторые - на восток.

Каждый час корова или

  • Останавливается, если трава в текущей ячейке уже съедена другой коровой.
  • Съедает всю траву в текущей ячейке и перемещается на одну ячейку вперёд в своём исходном направлении.

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

Если две коровы попадут одновременно на одну и ту же ячейку с травой, они поедят вместе и продолжат движение в своих направлениях в следующий час.

Определите количество травы, съеденной каждой коровой. Некоторые коровы никогда не остановятся и поэтому съедят бесконечно количество травы.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка ввода содержит \(N\). Каждая из последующих \(N\) строк описывает тартовую позицию коровы в терминах символ (N - если будет двигаться на север, E если будет двигаться на восток) и два неотрицательных целых числа \(x\) и \(y\) (\(0\le x\le 10^9\), \(0\le y\le 10^9\)) координаты ячейки. \(x\)-координаты различны для всех коров, аналогично и \(y\)-координаты различны для всех коров.

Чтобы было понятнее, относительно направлений и координат, если корова находится в ячейке \((x,y)\) и двигается на север, то она перейдёт в ячейку \((x,y+1)\), а если на восток - то в ячейку \((x+1, y)\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Выведите \(N\) строк. Строка \(i\) должна содержать количество ячеек травы, которая съест \(i\)-ая корова. Если корова съест бесконечное количество травы, выведите "Infinity" для этой коровы.

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

Имеется \(N\) барьеров, последовательно пронумерованных \(1 \ldots N\) \((2 \leq N \leq 10^5\)), каждый из которых описывается отрезком на двумерной карте маршрута. Эти отрезки не должны пересекаться даже в конечных точках.

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

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

ФОРМАТ ВВОДА (файл cowjump.in):

Первая строка ввода содержит число \(N\). Каждая из последующих \(N\) строк описывает один отрезок четырьмя целыми числами \(x_1\) \(y_1\) \(x_2\) \(y_2\), все не отрицательные целые числа не более чем \(10^9\). Отрезок имеет в качестве конечных точки \((x_1, y_1)\) и \((x_2, y_2)\). Все конечные точки различаются друг от друга.

ФОРМАТ ВЫВОДА (файл cowjump.out):

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

Valleys#90080

Беси рассматривает решётку \(N \times N\) ячеек, где каждая ячейка имеет высоту. Каждая ячейка вне этой решётки считается имеющей бесконечную высоту.

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

Более формально:

  • Множество ячеек называется "смежными с торцевой", если можно достичь любую ячейку этого множества из любой двигаясь вправо, влево, вверх, вниз.
  • Множество ячеек называется "точечно-смежным" если можно из любой ячейки множества достичь любой другой ячейки множества, двигаясь, влево, вправо, вверх, вниз или по диагонали.
  • Регион - это непустое множество ячеек "смежных с торцевой".
  • Регион называется дырявым, если дополнение региона (которое включает бесконечные ячейки вне решётки) не является "точечно-смежным".
  • Граница региона - это множество ячеек, ортогонально соседних (вверх, вниз, влево, вправо) к некоторой ячейке региона, но не принадлежащих региону.
  • "Долина" это любой недырявый регион, в котором каждая ячейка имеет высоту ниже чем каждая ячейка границы долины.

Цель Беси - определить сумму размеров всех долин.

Примеры

Это регион:

oo.
ooo
..o

Это не регион (средняя ячейка и нижняя правая ячейка не являются "смежными с торцевой"):

oo.
oo.
..o

Это регион без дыр:

ooo
o..
o..

Это дырявый регион (одна ячейка внутри):

ooo
o.o
ooo

Это другой недырявый регион (центральная ячейка является точечно-смежной с ячейкой в правом нижнем углу):

ooo
o.o
oo.

ФОРМАТ ВВОДА (файл valleys.in):

Первая строка содержит целое число \(N\), где \(1 \le N \le 750\).

Каждая из следующих \(N\) строк содержит \(N\) целых чисел - высоты ячеек решётки. Каждая высота \(h\) удовлетворяет \(1 \le h \le 10^6\). Все высоты различны.

в 19% тестов гарантируется \(N \leq 100\).

ФОРМАТ ВЫВОДА (файл valleys.out):

Выведите одно целое число, сумму размеров всех долин.

Фермер Джон планирует построить \(N\) (\(1 \leq N \leq 10^5\)) ферм, которые будут соединены \(N-1\) дорожками, образовывая дерево. Обычно когда на одной из ферм возникает проблема, он получает информацию в виде " имеется проблема на одной из ферм на пути от фермы \(A\) к ферме \(B\).

ФД рассматривает ферму как точку на 2-мерной плоскости. Он хотел бы получать информацию о проблемах на одной из ферм в прямоугольных координатах. А именно он хочет получать информацию в виде не более двух прямоугольников, параллельных осям координат, чьё пересечение пустое, а объединение содержит все фермы на пути от \(A\) к \(B\). Вы должны помочь ФД определить, как расположить его фермы так, чтобы условие выполнялось.

Это интерактивная задача. Вы не должны использовать ввод-вывод. Решения, использующие ввод-вывод будут дисквалифицированы. Но Вам разрешено использовать глобальные и статические переменные. Вы должны разработать следующие функции:

  • void addRoad(int A, int B): обрабатывает дорогу между фермами \(A\) и \(B\) (\(0 \le A, B \le N - 1\)).
  • void buildFarms(): Определяет, где ФД должен построить все свои фермы.
  • void notifyFJ(int A, int B): сообщает ФД один или два прямоугольника, которые удовлетворяют вышеописанным условиям

Ваша реализация указанных выше функций должна вызывать следующие функции, перечисленные ниже. Вы можете полагать, что \(\texttt{notifyFJ}\) будет вызвана \(Q\) раз.

  • int getN(): получить значение \(N\).
  • int getQ(): получить значение \(Q\).
  • void setFarmLocation(int ID, int X, int Y): определяет, что ФД должен построить ферму с номером \(ID\) (\(0 \le ID \le N-1\)) в позиции \((X,Y)\), где \((1 \le X, Y \le 10^5 )\). Она будет вызвана из \(\texttt{buildFarms}\).
  • void addBox(int X1, int Y1, int X2, int Y2): добавляет прямоугольник для сообщения ФД, \((1 \le X1 \le X2 \le 10^5 )\) и \((1 \le Y1 \le Y2 \le 10^5 )\). Вызывается только из \(\texttt{notifyFJ}\).

Интерактивный протокол работает следующим образом: Сначала \(\texttt{addRoad}\) вызывается \(N-1\) раз, чтобы информировать Вашу программу о системе дорог. Затем, будет вызвана \(\texttt{buildFarms}\) и Вы должны будете определить, где ФД должен построить каждую свою ферму соотвественно. А потом будут \(Q\) вызовов \(\texttt{notifyFJ}\) где Вы должны будете сделать один или два вызова \(\texttt{addBox}\) для нотификации ФД.

Гарантируется, что всегда существует корректный способ нотифицировать ФД одним или двумя прямоугольниками. Ограничение по памяти для данной задачи 512 Мбт (в отличие от обычных 256).

Для C++ решений, используйте такой template:

#include "grader.h"

void addRoad(int a, int b){
	// Fill in code here
}

void buildFarms(){
	// Fill in code here
}

void notifyFJ(int a, int b){
	// Fill in code here
}

Для Java решений, исполозуйте такой template:

import java.io.IOException;
// If you find it necessary, you may import other standard libraries here.
public class boxes extends Grader {

  	// Copy this exactly:
        
Override
  	public static void main(String args[]) throws IOException { new boxes().run(); }

        
Override
  	public void addRoad(int a, int b) {
      // Fill in code here
  	}
        
Override
  	public void buildFarms(){
      // Fill in code here
	  }
  	
Override
  	public void notifyFJ(int a, int b){
      // Fill in code here
  	}
}
}

Пример взаимодействия

Grader calls \(\texttt{addRoad(0,1)}\)

Grader calls \(\texttt{addRoad(1,2)}\)

Grader calls \(\texttt{buildFarms()}\)

Solution calls \(\texttt{setFarmLocation(0,1,1)}\)

Solution calls \(\texttt{setFarmLocation(1,1,2)}\)

Solution calls \(\texttt{setFarmLocation(2,2,2)}\)

Solution ends \(\texttt{buildFarms()}\)

Grader calls \(\texttt{notifyFJ(0,0)}\)

Solution calls \(\texttt{addBox(1,1,1,1)}\)

Solution ends \(\texttt{notifyFJ(0,0)}\)

Grader calls \(\texttt{notifyFJ(0,2)}\)

Solution calls \(\texttt{addBox(1,1,1,2)}\)

Solution calls \(\texttt{addBox(2,2,2,2)}\)

Solution ends \(\texttt{notifyFJ(0,2)}\)

Грайдер завершает свою работу, решение прошло тест.

Автор: Spencer Compton

Фермер Джон хочет поделить \(N\) своих коров \((N \leq 7500)\), последовательно пронумерованных \(1 \ldots N\), на \(K\) непустых групп (\(2 \leq K \leq N\)) таких, что никакие две коровы из двух различных групп не смогут общаться друг с другом не пройдя несколько миль. Коровы \(x\) и \(y\) (где \(1 \leq x < y \leq N\)) готовы пойти \((2019201913x + 2019201949y)\text{ mod } 2019201997\) миль чтобы увидеть друг друга.

Задано разделение \(N\) коров на \(K\) непустых групп. Пусть \(M\) - минимальное количество миль, которое любые две коровы из двух любых различных групп готовы пройти, чтобы увидеть друг друга. ФД хочет оптимально разделить \(N\) коров на \(K\) групп так, чтобы M было максимально возможным. Ограничение по памяти для этой задачи 512 Мбт (обычно 256 Мбт).

ФОРМАТ ВВОДА (файл walk.in):

Введите два числа \(N\) и \(K\) в одной строке.

ФОРМТ ВЫВОДА (файл walk.out):

Выведите оптимальное \(M\)

Фабрика Фермера Джона по производству молока состоит из \(N\) обрабатывающих станций, последовательно пронумерованных \(1 \ldots N\) (\(1 \leq N \leq 100\)), и \(N-1\) дорожек, каждая из которых соединяет некоторую пару станций. Каждая станция достижима из любой посредством нескольких из этих дорожек.

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

Однако, ФД думает, что не всё потеряно, поскольку существует как минимум одна такая станция \(i\), что до неё можно добраться из любой станции. Заметим, что попадание из станции \(i\), в некоторую станцию \(j\) может потребовать прохода через некоторые промежуточные станции между \(i\) и \(j\). Определите, существует ли такая станция \(i\).

ФОРМАТ ВВОДА (файл factory.in):

Первая строка содержит целое число \(N\), количество обрабатывающих станций. Каждая из последущих \(N-1\) строк содержит два разделённых пробелом целых числа \(a_i\) и \(b_i\), где \(1 \leq a_i, b_i \leq N\) и \(a_i \neq b_i\). Они указывают наличие конвейера из станции \(a_i\) в станцию \(b_i\), позволяющего перемещение только в одном направлении - из \(a_i\) в \(b_i\).

ФОРМАТ ВЫВОДА (файл factory.out):

Если существует такая станция \(i\), такая, что из неё можно добраться до любой другой станции, то выведите минимальное такое \(i\), иначе выведите \(-1\).

Наступил 3019 год, и за прошедшие 1000 лет произошла удивительная эволюция коров.

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

Листья на дне дерева указывают все образовавшиеся под-популяции коров в 3019 году. Никакие листья (под-популяции) не содержат идентичные множества качеств. На рисунке под-популяция #1 не имеет никаких привнесённых качеств, а под-популяция #3 содержит качества "telepathic flying". Под-популяция #2 содержит качество "flying".

Эволюционное дерево такое, как изображено на рисунке, называется "правильным", если каждое новое качество появляется ровно на одном ребре дерева (то есть такая эволюция состоялась только в одной точке истории). Например, дерево будет неправильным, если качество "spots" возникнет в двух отдельных ветках. По заданному описанию под-популяций, определите, может ли оно быть описано "правильным" деревом.

ФОРМАТ ВВОДА (файл evolution.in):

Первая строка ввода содержит количество под-популяций, \(N\) (\(2 \leq N \leq 25\)). Каждая из последующих \(N\) строк описывает одну под-популяцию. Эта строка начинается с целого числа \(K\) (\(0 \leq K \leq 25\)), за которым следуют \(K\) характеристик всех коров этой популяции. Характеристики - это строки, содержащие до 20 маленьких латинских символов (a..z). Никакие из под-популяций не содержат в точности одни и те же характеристики.

ФОРМАТ ВЫВОДА (файл evolution.out):

Выведите "yes" если возможно сформировать правильное эволюционное дерево и "No" в противном случае.

Наступило время, когда Фермер Джон садит траву на всех своих полях. Имеется \(N\) полей (\(1 \leq N \leq 10^5\)), последовательно пронумерованных \(1 \ldots N\) и удобно соединенных \(N-1\) двунаправленными дорожками таким образом, что из каждого поля можно добраться до каждого с помощью некоторой последовательности дорожек.

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

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

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

ФОРМАТ ВВОДА (файл planting.in):

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

ФОРМАТ ВЫВОДА (файл planting.out):

Выведите минимальное количество типов травы, которое ФД должен использовать.

Ферма состоит из \(N\) полей (\(1 \leq N \leq 2 \cdot 10^5\)), последовательно пронумерованных \(1 \ldots N\), и удобно соединённых множеством из \(M\) двунаправленных тропинок (\(1 \leq M \leq 2 \cdot 10^5\)). Будучи "существами привычки" коровы используют одно множество из \(N-1\) тропинок для всех своих ежедневных перемещений между полями. Они называют эти тропинки "стандартными" тропинками. Возможно добраться от любого поля до любого другого поля, используя только стандартные тропинки.

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

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

ФОРМАТ ВВОДА (файл exercise.in):

Первая строка ввода содержит \(N\) и \(M\). Каждая из следующих \(M\) строк содержит два целых числа \(a_i\) и \(b_i\) описывающих конечные точки тропинки. Первые N-1 из них - стандартные тропинки.

ФОРМАТ ВЫВОДА (файл exercise.out):

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

Shortcut#90064
Каждый день фермер Джон звонит в гигантский колокол, созывая своих коров в амбар на обед. Все коровы идут кратчайшим путём.

Ферма описывается как \(N\) полей (\(1 \leq N \leq 10,000\)), последовательно пронумерованных \(1 \ldots N\), амбар находится в поле 1. Поля соединены \(M\) двунаправленными тропинками (\(N-1 \leq M \leq 50,000\)). С каждой тропинкой ассоциировано время её прохождения, и от любого поля имеется путь к амбару, состоящий из некоторого множества тропинок.

Поле \(i\) содержит \(c_i\) коров. Услышав колокол, все коровы двигаются к амбару так, чтобы потратить минимальное количество времени. Если имеется несколько путей с минимальным временем, коровы выбирают "лексикографически минимальный" путь. Например, путь через поля 7,3,6,1 лексикографически минимальнее, чем путь 7,5,1.

ФД хочет сократить общее время движения (сумму времён движения всех коров) как можно больше добавлением одной сокращающей тропинки, которая имеет время прохождения \(T\) (\(1 \leq T \leq 10,000\)), от амбара (поле 1) до другого поля, которое он выберет. Если корова встретится с этой сокращающей тропинкой на своём обычном пути, тогда корова пойдёт по этой тропинке, если в результате уменьшится время её прихода в амбар. Иначе, корова пойдёт по своему обычному маршруту, даже если бы она могла уменьшить своё время в пути, используя сокращающую тропинку.

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

ФОРМАТ ВВОДА (файл shortcut.in):

Первая строка ввода содержит \(N\), \(M\), \(T\). Каждая из \(N\) последующих строк содержит \(c_1 \ldots c_N\) - целое число в интервале \(0 \ldots 10,000\). Каждая из последующих \(M\) строк описывает тропинку тремя целыми числами \(a\), \(b\), \(t\), обозначающими, что поля \(a\) и \(b\) соединены тропинкой время прохождения которой равно \(t\). Все времена в интервале \(1 \ldots 25,000\).

ФОРМАТИ ВВОДА (файл shortcut.out):

Выведите наибольшее возможное сокращение суммарного времени движения, которое может добиться ФД.

Длительная засуха оставила без травы \(N\) пастбищ фермера Джона. Поскольку приближается сезон дождей, время восстанавливать траву высевая её. В сарае у ФД имеется два ведра, каждое содержит семена травы своего типа. ФД хочет засеять травой каждое из его \(N\) пастбищ, выбирая ровно один тип для каждого пастбища.

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

Определите количество различных способов, которыми ФД может засадить травой эти \(M\) пастбищ.

ФОРМАТ ВВОДА (файл revegetate.in):

Первая строка ввода содержит \(N\) (\(2 \leq N \leq 10^5\)) и \(M\) (\(1 \leq M \leq 10^5\)). Каждая из последующих \(M\) строк содержит символ 'S' или 'D', за которым следуют два числа в интервале \(1 \ldots N\), описывающих пару пастбищ, которые являются любимыми для этой коровы. Символ 'S' означает, что корова должна есть один и тот же тип травы на обоих своих пастбищах, символ 'D' означает, что корова должна есть разные тип травы на обоих своих пастбищах.

ФОРМАТ ВЫВОДА (файл revegetate.out):

Выведите количество способов которыми ФД может рассадить траву на своих пастбищах. Ответ вывести в двоичном формате.

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