Алгоритмы на графах

337 задачвместе с подтемами
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.
Фермер Джон планирует построить \(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

Беси с друзьями попала в ловушку и разрабатывает план побега. Ловушка состоит из \(NK\) ячеек, в виде прямоугольной решётки \(N \times K\). В каждой ячейке имеется проход между горизонтально и вертикально соседними ячейками. В каждой ячейке находится ровно одна корова.

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

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

Поскольку это число может быть очень большим, выводите его остаток по модулю \(10^9 + 7\).

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

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

Каждая из последующих \(N\) строк содержит \(K-1\) целое число - стоимости разблокирования каждого прохода в горизонтальном направлении.

Каждая из последующих \(K\) строк содержит \(N-1\) целое число - стоимости разблокирования каждого прохода в вертикальном направлении.

Все стоимости от \(1\) до \(10^9\) включительно.

В 20% тестов гарантируется, что \(N \leq 500\) и все веса от \(1\) до \(5\) включительно.

В других 20% тестов гарантируется \(N \leq 5000\).

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

Одно целое число - количество планов минимальной стоимости по модулю \(10^{9} + 7\).

На ферме пожар и коровы должны спасаться.

Ферма описывается решёткой \(10 \times 10\) символов:

..........
..........
..........
..B.......
..........
.....R....
..........
..........
.....L....
..........

Символ 'B' представляет амбар, который горит. Символ 'L' представляет озеро, символ 'R' представляет огромную скалу.

Коровы хотят сформировать "ведерную бригаду", разместившись вдоль пути между озером и амбаром так, чтобы они могли передавать друг другу воду для тушения пожара. Ведро может передаваться между коровами, если они являются непосредственными соседями в направлении "север", "юг", "запад", "восток". Аналогично корова может набирать воду из озера, если она аналогично соседствует с ним. Наконец корова может поливать амбар из ведра, только если она аналогично непосредственно соседствует с ним.

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

Корова не может находится в квадрате, содержащем скалу, амбар или озеро. Гарантируется, что они не будут соседними друг другу.

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

Входной файл содержит 10 строк, каждая по 10 символов, описывающих план фермы.

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

Выведите одно целое число - минимальное количество коров, требуемых для того, чтобы сформировать "ведерную бригаду".

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

Конфигурация мороженого, которое производится машиной, может быть описано решёткой \(N \times N\) grid (\(1 \leq N \leq 1000\)):

##....
....#.
.#..#.
.#####
...###
....##

Каждый символ '.' представляет пустое место, а каждый символ '#' представляет \(1 \times 1\) квадратную ячейку мороженого.

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

ФД хочет найти площадь и периметр сгустка, который имеет наибольшую площадь. Площадь сгустка равна количеству символов '#' в его картинке. Если несколько сгустков имеют одинаковую площадь, он хочет знать минимальный периметр из них. На рисунке выше, маленький сгусток имеет площадь 2 и периметр 6, а больший сгусток имеет площадь 13 и периметр 22.

Заметим, что сгусток может иметь "дыру" внутри (пустое пространство, окружённое мороженым). В таком случае граница "дыры" также учитывается в периметре сгустка. Сгусток может находиться внутри другого сгустка, в этом случае они рассматриваются как независимые сгустки. Например, ниже представлен сгусток площади 1 внутри сгустка площади 16:

#####
#...#
#.#.#
#...#
#####

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

Первая строка ввода содержит \(N\), а следующие \(N\) строк описывают вывод машины. Присутствует, как минимум, один символ '#'.

ФОРМАТ ВЫВОДА (файл perimeter.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):

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

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

\(M\) друзей ФД (\(1 \leq M \leq 10^5\)) часто его посещают. Во время визита друга \(i\), ФД вместе с ним путешествует по уникальному пути от фермы \(A_i\) до фермы \(B_i\) (возможно \(A_i = B_i\)). Дополнительно, они пробуют молоко каждой коровы на своём пути. Поскольку друзья ФД также фермеры, они имеют сильное предпочтение по молоку. Каждый из них пьёт молоко только определённого типа коров. Любой из друзей ФД будет счастливым, только если сможет попить свой предпочитаемый тип молока во время пути.

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

ОЦЕНИВАНИЕ:

  • Тест 2 второй пример, приведенный ниже.
  • Тест 3 удовлетворяет \(N\le 10^3, M\le 2\cdot 10^3\).
  • Тесты 4-7 удовлетворяют \(C_i\le 10\) (\(C_i\) определено ниже).

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

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

Вторая строка ввода содержит \(N\) разделённых целых чисел \(T_1,T_2,\ldots, T_N\). Тип коровы на \(i\)-ой ферме обозначен \(T_i\).

Каждая из последующих \(N-1\) строк содержит два различных целых числа \(X\) и \(Y\) (\(1 \leq X, Y \leq N\)), указывающих, что имеется дорожка между фермами \(X\) и \(Y\).

Последующие \(M\) строк содержат целые числа \(A_i\), \(B_i\), \(C_i\). \(A_i\) и \(B_i\) представляют конечные точки пути во время визита \(i\)-ого друга, \(C_i\) (\(1\le C_i\le N\)) указывает тип молока, предпочитаемый этим другом.

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

Выведите двоичную строку длины \(M\). \(i\)-ый символ этой строки должен быть '1', если \(i\)-ый друг будет счастлив, иначе - '0'.

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

Однако если одну из дорожек заблокировать, то ферма разделится на две части, внутри каждой из которых связность сохранится, а между ними - нет. Поэтому ФД строит \(M\) дополнительных дорожек (\(1 \leq M \leq 50,000\)), каждая из которых имеет положительную целую длину не более \(10^9\). Коровы пользуются исходными дорожками, пока это возможно.

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

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

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

Первая строка ввода содержит \(N\) и \(M\). Каждая из последующих \(N-1\) строк описывает оригинальную дорожку целыми числами \(p\) \(q\), где \(p\) \neq q$ - пастбища, соединённые этой дорожкой (в интервале \(1 \ldots N\)). Каждая из оставшихся \(M\) строк описывает дополнительную дорожку тремя целыми числами \(p\), \(q\), \(r\), где \(r\) длина этой дорожки. Не более одной дорожки пролегает между любыми двумя пастбищами.

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

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

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

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

Наблюдения ФД приоритезированы, поэтому его цель - максимизировать значение \(X\) так, чтобы выполнились условия первых \(X\) наблюдений. Если несколько порядков дойки могут удовлетворять \(X\) наблюдениям, он выбирает тот, в котором корова с меньшим номером доится раньше. Иными словами, если несколько порядков дойки удовлетворяют этим условиям, ФД выбирает лексикографически наименьший. Порядок \(x\) является лексикографически меньшим, чем порядок \(y\), если для некоторого \(j\), , \(x_i = y_i\) для всех \(i < j\) и \(x_j < y_j\) (другими словами два порядка идентичны до некоторой точки, в которой \(x\) меньше чем \(y\)).

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

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

Первая строка содержит числа \(N\) и \(M\). Каждая из следующих \(M\) строк описывает одно наблюдение. Строка \(i+1\) описывает наблюдение \(i\) и начинается с количества коров \(m_i\) в этом наблюдении, за которым следует список из \(m_i\) целых чисел, определяющих порядок коров в этом наблюдении. Сумма \(m_i\) не превышает \(200,000\).

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

Выведите \(N\) разделённых пробелом целых чисел дающих перестановку чисел of \(1 \ldots N\), содержащую порядок в котором ФД должен доить своих коров.

\(N\) коров (\(2 \leq N \leq 100\)) Фермера Джона, последовательно пронумерованных \(1 \ldots N\) разработали структуру утреннего доения. Она основывается на двух ключевых свойствах:

1. Некоторые коровы настаивают чтобы их доили раньше - в соответствии с их социальным статусом. Например, корова 3 имеет наивысший статус, корова 3 имеет средний статус, а корова 5 имеет низкий статус, то корову 3 нужно доить первой, затем корову 2 и затем корову 5.

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

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

К несчастью, корова 1 заболела, поэтому ФД хочет подоить эту корову как можно раньше, чтобы раньше отпустить её в амбар отдыхать и выздоравливать. Помогите ФД определить самую раннюю позицию, в которой можно будет подоить корову 1.

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

Первая строка содержит \(N\), \(M\) (\(1 \leq M < N\)), \(K\) (\(1 \leq K < N\)), указывающая, что у ФД \(N\) коров, \(M\) из которых организованы в социальную иерархию, \(K\) из которых требуют, чтобы их подоили в определённой позиции порядка. Следующая строка содержит \(M\) различных целых чисел \(m_i\) (\(1 \leq m_i \leq N\)). Коровы, представленные в этой строке должны доиться в порядке, в котором они появились в этой строке. Следующие \(K\) строк содержат по по два целых числа \(c_i\) (\(1 \leq c_i \leq N\)) и \(p_i\) (\(1 \leq p_i \leq N\)), указывающих, что корова \(c_i\) должна быть подоена на позиции \(p_i\).

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

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

Выведите самую раннюю позицию, на которой можно подоить корову 1.

Беси попала на дальнюю ферму. Эта ферма состоит из \(N\) амбаров (\(2 \leq N \leq 7 \cdot 10^4\)) и \(N-1\) двунаправленных туннелей между амбарами, так что между любыми двумя амбарами имеется путь, и он единственный. Каждый амбар, который имеет только один туннель, является выходом. Когда придёт утро, Беси приземлится на некоторый амбар и попытается достичь выхода.

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

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

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

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

Заметим время на тест в этой задаче больше чем по умолчанию: 4 секунды для C/C++/Pascal, и 8 секунд для Java/Python.

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

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

Имея много свободного времени, коровы Фермера Джона часто играют в видеоигры. Одна из их любимых игр похожа на Puyo Puyo. Коровья версия этой игры называется Му-Му.

Игра Му-Му происходит на высокой узкой решётке из \(N\) ячеек в высоту и (\(1 \leq N \leq 100\)) и 10 ячеек в ширину. Вот пример для \(N = 6\):

0000000000
0000000300
0054000300
1054502230
2211122220
1111111223

Каждая ячейка или пустая (обозначена 0) или содержит стог сена одного из 9 различных цветов (обозначенных символами 1..9). Гравитация вынуждает стоги сена падать вниз, поэтому никогда 0 не будет ниже, чем стог сена.

Две ячейки принадлежат одному и тому же связному региону, если они имеют общую вертикальную или горизонтальную сторону и один и тот же цвет, отличный от 0. Каждый раз, когда регион начинает содержать \(K\) или более ячеек, все его стоги сена исчезают - превращаются в 0. Если в один момент времени существует несколько таких регионов они исчезают все одновременно. Затем, гравитация может вынудить стоги сена заполнить некоторые из ячеек, которые стали нулевыми. В получившейся конфигурации могут снова образоваться региона размера не менее \(K\) ячеек. В этом случае они также исчезают (одновременно, если есть несколько таких регионов). Затем гравитация вновь двигает вниз стоги сена и процесс повторяется, пока есть хоть один регион, в котором не менее \(K\) стогов.

По заданной конфигурации доски для Му-Му вычислите финальную картинку доски после выполнения всех операций.

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

Первая строка ввода содержит \(N\) и \(K\) (\(1 \leq K \leq 10N\)). Оставшиеся \(N\) строк задают начальное состояние доски.

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

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

У Беси и Эльзы по N (\(1 \leq N \leq 10^5\)) пирогов. Каждый из \(2N\) пирогов имеет величину вкусности по мнению Беси и величину вкусности (возможно отличающуюся) по мнению Эльзы.

Беси хочет отдать один из своих пирогов Эльзе. Если Эльза получит пирог от Беси, она должна будет отдать один из своих пирогов Беси. Чтобы не оказаться ни скупой, ни щедрой, Эльза постарается выбрать пирог, как минимум, такой же вкусный (по мнению Эльзы) как она получила, но не более чем на \(D\) единиц вкуснее (\(0 \leq D \leq 10^9\)). Такой пирог может не существовать, в этом случае Эльза сбежит в Японию.

Но если Эльза отдаст Беси пирог взамен, то Беси аналогично постарается отдать Эльзе пирог, как минимум такой же вкусный (по мнению Беси), но не более чем на \(D\) единиц вкуснее, чем кусок, который она получила. Если Беси не сможет, то тоже сбежит. Иначе отдаст кусок Эльзе. Этот цикл продолжается, пока возможно, или пока одна из коров не получит кусок с величиной вкусности равной \(0\), в этом случае процесс заканчивается и обе коровы счастливы.

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

Для каждого из \(N\) кусков Беси может выбрать его как начальный подарок Эльзе. Определите минимальное количество кусков, которые могут быть подарены так, чтобы обе коровы оказались счастливы.

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

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

Следующие \(2N\) строк содержат по два целых числа, разделённых пробелом, соответственно обозначающие вкусность данного куска по мнению Беси и по мнению Эльзы.

Первые \(N\) строк о кусках Беси, а оставшиеся \(N\) строк о кусках Эльзы.

Гарантируется, что все величины вкусности в интервале \([0,10^9]\).

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

На выводе должно быть \(N\) строк. Строка \(i\) должна содержать одно целое число: минимальное количество кусков, которое может быть подарено при счастливом исходе, если Беси начнёт с куска \(i\). Если счастливый исход при начале с куска \(i\) невозможен, то строка \(i\) должна содержать \(-1\).

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

Ферма состоит из \(N\) амбаров, соединённых \(M\) двунаправленными дорожками между некоторыми парами амбаров (\(1 \leq N, M \leq 200,000\)). ФД закрывает один амбар за раз. После того как амбар закрыт, все дорожки, прилегающие к нему тоже становятся закрытыми и не могут больше использоваться.

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

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

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

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

Вывод содержит \(N\) строк, каждая есть "YES" или "NO". Первая строка отвечает на попрос была ли ферма полностью связанной изначально, а далее строка \(i+1\) указывает, осталась ли ферма полностью связной после \(i\)-го закрывания.

Фермер Джон недавно купил новую машину с двумя навигационными
системами GPS. Что ещё хуже, они часто конфликтуют при выборе
Маршрута.

Карта региона, в котором живёт ФД представляет собой N перекрёстков
(2 <= N <= 10,000) и M двунаправленных дорог (1 <= M <= 50,000).
Дорога I соединяет перекрёстки Ai (1 <= Ai <= N) и Bi (1 <= Bi <= N).

Множество дорого может соединять одну и ту же пару перекрёстков.
Двунаправленные дороги представлены двумя раздельными
однонаправленными дорогами в противоположных направлениях.

Дом ФД находится в перекрёстке 1, а его ферма распложена в перекрёстке
N. Существует путь из дома на ферму, по серии однонаправленных дорог.

Обе GPS-системы используют карту описанную выше, однако они дают
различные значения времени проезда по каждой дороге. Дорога I
требует Pi единиц времени по первой GPS-системе и Qi единиц времени
по второй (каждая из величин – целое число в интервале 1..100,000).

ФД хочет проехать от дома до фермы. Однако каждая GPS-система громко
оповещает ФД каждый раз, когда ФД выбирает дорогу (например, от
перекрёстка X до перекрёстка Y) которую GPS не считает частью
кратчайшего пути от X до фермы (возможно даже что предупреждение
выдают обе GPS-системы, если ФД выбирает дорогу, которую каждая из
GPS считает не принадлежащей к кратчайшему маршруту).

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

PROBLEM NAME: gpsduel

Формат ввода:

* Строка 1: целые числа N и M.
* Строка 2-N+1: Строка i описывает дорогу i четырьмя
целыми числами: Ai Bi Pi Qi.

Примечание

Всего имеется 5 перекрёстков и 7 однонаправленных дорог. Первая
дорога идёт от перекрёстка 3 к перекрёстку 4, первая GPS считает,
что нужно 7 единиц времени для проезда по этой дороге, а вторая GPS
- полагает, что требуется одна единица времени.

Формат вывода:

* Строка 1: Минимальное количество предупреждений, которое
может получить ФД при оптимальном проезде от дома до фермы.

Примечание

Если ФД выберет путь 1 -> 2 -> 4 -> 5, тогда первая GPS пожалуется на
дороге 1->2 (она предпочитает путь 1>3). Однако в остальной части маршрута
2 -> 4 -> 5, обе GPS промолчат, поскольку обе считают такой маршрут
кратчайшим от 2 до 5.


Фермер Джон спрятал ключи от трактора в сейфе. Коровы пытаются взломать этот сейф. Сейф защищён сложной парольной системой. Она организована как корневое дерево из N (1 <= N <= 20,000) вершин, каждая из которых требует цифру от 0 до 9. Вершины пронумерованы от 0 до N-1.
Единственная информация, которой владеют коровы – что определённая последовательность длины 5 не случается на путях в этом дереве.
Например, предположим, то дерево выглядит так (с корнем в A):
A <- B <- C <- D <- E ^ | F
Коровы могут знать, что последовательность 01234 не случится начиная от F, И что последовательность 91234 не случится, начиная от E. Эта информация приводит к тому, что возможными остаются 19 паролей, все такого вида:
The cows might know that the sequence 01234 does not occur starting at F, and that the sequence 91234 does not occur starting at E. This information rules out 19 possible passcodes: all those of the form
4 <- 3 <- 2 <- 1 <- * ^ | 0
или
4 <- 3 <- 2 <- 1 <- 9 ^ | *
Что даёт 19 паролей, поскольку такой
4 <- 3 <- 2 <- 1 <- 9 ^ | 0
появится дважды
По заданным M (1 <= M <= 50,000) последовательностям длины 5, вместе с их стартовой позицией в дереве помогите коровам вычислить сколько паролей будет подходить. Вы должны выводить свой ответ по модулю 1234567.

PROBLEM NAME: code
Формат ввода:
* Строка 1: Два разделённых пробелом целых числа, N и M.
* Строки 2..N: Строка i+1 содержит одно целое число p(i), означающее родителя вершин I в дереве (0 <= p(i) < i).
* Строки N+1..N+M: Строка N+i описывает i-ую последовательность про которую известно, что она не произойдёт в коде. Строка содержит v(i) и s(i), разделённые пробелом. Здесь v(i) - стартовая вершина последовательности, s(i) – строка из 5 цифр, которая не встретится в шифре начиная с вершины v(i) если двигаться вверх по дереву. Гарантируется, что корень дерева находится не менее чем в 4 шагах от v(i).


У Фермера Джона имеется N (1 <= N <= 50,000) пастбищ, последовательно пронумерованных от 1 до N, соединённых M (1 <= M <= 100,000) двунаправленными дорогами. Дорога I соединяет пастбища Ai (1 <= Ai <= N) и Bi (1 <= Bi <= N), Ai != Bi. Возможны две дороги соединяющие одну и ту же пару пастбищ.
Беси хочет украсить пастбища к дню рождения ФД. Она хочет разместить на каждом пастбище огромный знак содержащий либо букву ‘F’ либо букву ‘J’, но чтобы не огорчать ФД, должно быть выполнено правило, Пастбища декорируются разными знаками, если они соединены дорогой.
Компания, изготавливающая знаки, требует больше денег за знак ‘F’ и меньше денег за знак ‘J’, поэтому Беси хочет максимизировать количество знаков ‘J’, которые она использует. Пожалуйста, определите это число или выведите -1, если невозможно расставить знаки по описанным правилам.
uses. Please determine this number, or output -1 if there is no valid way to arrange the signs.
PROBLEM NAME: decorate
Формат ввода:
* Строка 1: Два целых числа N и M.
* Строки 2..M+1: Два целых числа, Ai и Bi указывающих наличие двунаправленной дороги между пастбищами Ai и Bi.
Примечание
Пастбища и дороги представляют собой вершины и стороны квадрата.
Формат вывода:
* Строка 1: Одно целое число, указывающее максимальное количество знаков ‘J’ которые сможет использовать Беси. Если нет решения, то выводить -1.
Примечание
Беси может пометить пастбища 1 и 3 знаком ‘J’ (или альтернативно - пастбища 2 и 4).

В связи с недостатком дождей Фермер Джон хочет построить ирригационную систему для доставки воды на N его полей (1 <= N <= 2000).
Все поля описываются различными точками (xi,yi) на плоскости, где 0<=xi,yi<=1000. Цена постройки трубы для доставки воды из точки i в точку j равна квадрату евклидового расстояния между ними:
(xi - xj)^2 + (yi - yj)^2
ФД хочет проложить минимальную по стоимости систему труб так, чтобы все его поля были соединены таким образом, чтобы водя из любого поля могла достичь любого другого поля по некоторой последовательности из проложенных труб.
К несчастью, подрядчик, у которого ФД заказал эту систему, отказывается прокладывать трубы стоимостью меньше чем C (1 <= C <= 1,000,000).
Пожалуйста, помогите ФД определить минимальное количество денег, которые ФД должен заплатить, чтобы проложить задуманную систему труб.
PROBLEM NAME: irrigation
Формат входных данных
* Строка 1: Целые числа N и C.
* Строки 2..1+N: Строка i+1 содержит целые числа xi и yi.
Формат выходных данных
* Строка 1: Минимальная стоимость задуманной сети труб , или -1 если такая сеть не может быть построена.
Примечание
ФД не может построить трубу между полями в точках (4,3) и (5,0), поскольку её стоимость не более 10. Поэтому он построит трубы между (0,2) и (5,0) со стоимостью 29 и трубу между (0,2) и (4,3) со стоимостью 17.
Cow Art#89934

Известно, что коровы не различают красный и зелёный цвета. Это затрудняет создание картин, которые бы одинаково воспринимались коровами и людьми.
Например, рассмотрим квадрат, описанный N*N решёткой символов (1 <= N <= 100), каждый из которых либо R (красный), G(зелёный) или B(синий). Рисунок интересен, если в нём много цветовых «регионов» которые могут отличаться друг от друга. Два символа считаются принадлежащими одному и тому же региону, если они являются непосредственно соседними (на восток, запад, север или юг) и если они неразличимы по цвету. Например, рисунок
RRRBB GGBBB BBBRR BBRRR RRRRR
для человека имеет 4 региона (2 красных, 1 синий, 1 зелёный), а для коровы только 3 (2 красно-зелёных и 1 синий) .
Для заданного на вводе рисунка определите количество регионов в нём для человека и коровы.
PROBLEM NAME: cowart
Формат входных данных
* Строка 1: Целое число N.
* Строки 2..1+N: Каждая строка содержит строку из N символов, описывающих одну строку рисунка.
Формат выходных данных
* Строка 1: Два разделённых пробелом целых числа, описывающих количество регионов в этом рисунке для человека и коровы.

Лыжная трасса описана решёткой из M x N высот (1 <= M,N <= 500), каждая из высот в диапазоне 0 .. 1,000,000,000.
Некоторые из этих ячеек обозначены как точки маршрута гонки. Организаторы хотят назначить маршруту рейтинг трудности D так, чтобы корова могла попасть в любую точки маршрута из любой другой точки маршрута, последовательно перемещаясь между соседними ячейками, абсолютная разность высот которых не превышает D. Две ячейки считаются соседними, если они граничат по стороне (в направлении на север, юг, запад или восток одна от другой). Рейтинг трудности маршрута это минимальное значение D такое, что все точки маршрута взаимно достижимы при выполнении вышеописанного требования.
PROBLEM NAME: ccski
Формат входных данных
* Строка 1: Целые числа M и N.
* Строки 2..1+M: Каждая из этих M строк содержит N целых высот.
* Строки 2+M..1+2M: Каждая из этих M строк содержит N величин 0 или 1, 1 указывает, что данная высота – точка маршрута гонки.

Формат выходных данных
* Строка 1: Рейтинг трудности маршрута (минимальное значение D такое, что все точки маршрута взаимно достижимы)
Примечание
Если D = 21, то все 3 точки маршрута взаимно достижимы. Если D<21 верхняя правая точка не достижимы из других двух.


Капитан (C) должен спасти доктора (D). Все происходит на двумернйо решетке NxM (1<=N,M<=500). Некоторые из ячеек пусты (и по ним можно двигаться), а некоторые блокированы (и по ним нельзя двигаться).
Движение подчиняется следующим законам:
1) Если под Капитаном нет ячейки (он находится на краю решетки), то он падает в бездну и миссия спасения не выполнена 2) если под Капитаном есть пустая ячейка, но падает в нее. 3) Иначе a) Капитан может двигаться влево или вправо, если соответствующая ячейка существует и пуста. б) Капитан может переключить направление гравитации.
Когда капитан переключает направление гравитации, ячейка которая "под ним" (в смысле правил 1 и 2) переключается между ячейками с большим индексом и ячейками с меньшим индексом. Первая строка имеет индекс 1, последняя строка имеет индекс N.
Помогите Капитану найти Доктора используя минимальное количество переключений гравитации. Если Капитан не может добраться до клетки с Доктором - выведите -1.
PROBLEM NAME: gravity
Формат входных данных
* Строка 1: Два разделенных пробелом целых числа N и M.
* Строки 2..1+N: Строка i+1 описывает i-ую строку решетки: '.' обозначает пустую клетку, '#' обозначает блокированную клетку, 'C' обозначает стартовую позицию Капитана, 'D' обозначает позицию Доктора.
Формат выходных данных
* Строка 1: Одно целое число - минимальное количество раз, когда Капитан переключал гравитацию, или -1, если Капитану не возможно добраться до Доктора.
Примечание
Капитан начинает в позиции (4,2). Он переключает гравитацию и падает в позицию (2,2) затем двигается вправо дважды и попадает в точку (2,4). Переключает гравитацию снова и падает в позицию (4,4), затем двигается вправо в позицию (4,5). Переключает гравитацию опять и падает в позицию Доктора в клетке (3,5).
Поделиться
Класснуть