На остров Робинзона выползли погреться на солнышке и задремали несколько крокодилов. Робинзон хочет прогнать неприятных соседей, не поднимая шума. Для этого он кидает в дремлющих крокодилов орехи.
В каждой клетке острова находится не более одного крокодила. Напуганный орехом крокодил быстро бежит строго по прямой, пока не окажется в воде. Для каждого крокодила известно направление, в котором он побежит, если его напугать. Направления, в которых будут убегать крокодилы, параллельны сторонам острова.
Если на пути напуганного крокодила окажется другой крокодил, то, столкнувшись, они разозлятся, и нападут на Робинзона. Поэтому надо тщательно выбирать очередного крокодила, чтобы на его пути были только пустые клетки.
Робинзон не кидает очередной орех, пока предыдущий крокодил не окажется в воде.
Требуется написать программу, определяющую максимальное количество крокодилов, которых можно прогнать, не разозлив их.
В первой строке входного файла записаны числа n и m — размеры острова с севера на юг и с запада на восток. Последующие n строк по m символов в каждой описывают текущее расположение крокодилов на острове. Если клетка свободна, то она обозначается точкой «.», а если там находится крокодил, то в ней указано направление, в котором побежит этот крокодил. Направления обозначаются буквами: «N» — север, «S» — юг, «E» — восток, «W» — запад
Выходной файл должен содержать одно число — максимальное количество крокодилов, которых можно прогнать, не разозлив.
Данная задача содержит три подзадачи. Для оценки каждой подзадачи используется своя группа тестов. Баллы за подзадачу начисляются только в том случае, если все тесты из этой группы пройдены.
1 <= \(n\), \(m\) <= 30. Подзадача оценивается в 30 баллов.
1 <= \(n\), \(m\) <= 500. Подзадача оценивается в 30 баллов.
1 <= \(n\), \(m\) <= 2000. Подзадача оценивается в 40 баллов.
Рисунок к третьему примеру
1 1 .
0
1 1 W
1
5 7 ....... ...S... ..WE... ...N... .......
2
Робот считает, что две тетради образуют беспорядок, если тетрадь с меньшим номером стоит правее тетради с большим номером. Например, в расстановке (2; 1; 5; 3; 4) беспорядки образуют три пары тетрадей (2; 1), (5; 3) и (5; 4), поэтому число беспорядков в такой расстановке равно 3.
После ремонта комнаты Петя забыл привычную расстановку своих тетрадей на полке и хочет её восстановить. Робот сохранил её, но он умеет сообщать только число беспорядков в сохраненной расстановке. Петя может попросить Робота поменять местами две тетради в сохраненной расстановке. После такого запроса Робот сохранит новую расстановку и сообщит число беспорядков в ней. Петя может повторять запросы до тех пор, пока не решит, что у него достаточно информации для восстановления привычной расстановки.
Требуется составить программу, которая, общаясь с Роботом, восстанавливает привычную расстановку тетрадей
Это интерактивная задача. В процессе тестирования ваша программа будет с использованием стандартных потоков ввода/вывода взаимодействовать с программой жюри, которая моделирует работу Робота.
Сначала ваша программа должна прочитать из стандартного потока ввода два целых числа \(n\) и \(m\) — количество тетрадей Пети и количество беспорядков в его привычной расстановке.
Затем протокол общения вашей программы и программы жюри следующий:
* Для перестановки двух тетрадей ваша программа выводит в стандартный поток вывода запрос в формате: swap \(i\) \(j\), где \(i\) и \(j\) — номера позиций тетрадей, которые Робот должен поменять местами (1 <= \(i\), \(j\) <= \(n\); i != j). После этого она должна считать из стандартного потока ввода одно целое число — количество беспорядков в получившейся расстановке. Ваша программа может сделать не более 300 000 запросов.
* Когда ваша программа сможет восстановить привычную расстановку тетрадей, она должна вывести эту расстановку в формате: answer \(p\), где \(p\) — последовательность из n различных целых чисел в диапазоне от 1 до \(n\), и завершить работу.
Запрос на обмен и вывод привычной расстановки должны завершаться переводом строки и сбросом буфера потока вывода. Для этого используйте flush(output) в Pascal/Delphi; fflush(stdout) или cout.flush() в С/C++.
Данная задача содержит четыре подзадачи. Для оценки каждой подзадачи используется своя группа тестов. Баллы за первую подзадачу начисляются только в том случае, если все тесты из этой группы пройдены. Тесты второй, третьей и четвертой подзадач оцениваются по отдельности.
1 <= \(n\) <= 100. Подзадача оценивается в 30 баллов.
1 <= \(n\) <= 8000. Подзадача оценивается в 20 баллов.
1 <= \(n\) <= 60000. Подзадача оценивается в 30 баллов.
1 <= \(n\) <= 100000. Подзадача оценивается в 20 баллов.
На детектор сверху направлена сверхскоростная камера на вращающемся в горизонтальной плоскости креплении. Ориентация камеры в каждый момент времени задаётся направляющей прямой. Камера может сфотографировать произвольную прямоугольную область, одна из сторон которой параллельна заданной направляющей прямой
Для анализа потенциальных столкновений частиц важно, чтобы на каждом фотоснимке были отображены все точки пересечений их траекторий. Камера использует очень дорогие расходные материалы, поэтому площадь каждого фотоснимка необходимо минимизировать.
Требуется написать программу, которая по хронологической последовательности событий двух типов:
• появление новой траектории частицы,
• получение фотоснимка камерой, ориентированной по заданной направляющей прямой,
определит для каждого фотоснимка минимальную площадь прямоугольной области, включающей все точки пересечения траекторий частиц, появившихся до этого снимка.
В первой строке входного файла задано одно целое число n (1 <= \(n\) <= 200 000) — общее количество событий. В следующих \(n\) строках заданы описания событий.
Описание каждого события состоит из пяти элементов. Первый элемент является символом «+», если это событие является появлением новой траектории, или символом «?», если это событие является получением фотоснимка. Последующие четыре элемента — целые числа \(x_1\), \(y_1\), \(x_2\), \(y_2\) (−10 000 <= \(x_1\), \(y_1\), \(x_2\), \(y_2\) <= 10 000) — координаты двух несовпадающих точек. Для событий первого типа указанные точки лежат на траектории частицы. Все траектории различны. Для событий второго типа указанные точки лежат на направляющей прямой камеры.
Пусть \(q\) — количество полученных фотоснимков. Выходной файл должен содержать \(q\) вещественных чисел — минимальные возможные площади фотоснимков, перечисленные в порядке их получения камерой.Тест будет успешно пройден, если для каждой из \(q\) выведенных площадей выполняется условие |a - b| / (max(1, b)) <= 10-4, где \(a\) — площадь, выведенная участником, \(b\) — площадь, полученная решением жюри.
Далее приведены рисунки для первого и второго примеров соответственно.
Для проверки решений этой задачи используются 50 тестов. Тесты оцениваются независимо. Каждый тест оценивается в 2 балла. Значения \(n\) и \(q\), а также некоторые характеристики тестов приведены в таблице.
Тест | n | q | Примечание |
1. | 10 | 1 | Направляющие прямые параллельны осям координат |
2. | 20 | 10 | Направляющие прямые параллельны осям координат |
3. | 745 | 365 | Направляющие прямые параллельны осям координат |
4. | 1997 | 10 | Направляющие прямые параллельны осям координат |
5. | 2000 | 1000 | Направляющие прямые параллельны осям координат |
6. | 100001 | 1 | Направляющие прямые параллельны осям координат |
7. | 100002 | 1 | Направляющие прямые параллельны осям координат |
8. | 200000 | 1 | Направляющие прямые параллельны осям координат |
9. | 200000 | 100000 | Направляющие прямые параллельны осям координат |
10. | 200000 | 130000 | Направляющие прямые параллельны осям координат |
11. | 1000 | 10 | |
12. | 500 | 250 | |
13. | 10100 | 10000 | |
14. | 700 | 100 | |
15. | 800 | 71 | |
16. | 2001 | 1000 | |
17. | 5003 | 2000 | |
18. | 7005 | 4000 | |
19. | 8007 | 1000 | |
20. | 9009 | 4500 | |
21. | 90100 | 90001 | |
22. | 5000 | 101 | |
23. | 6000 | 98 | |
24. | 5432 | 2345 | |
25. | 9508 | 4079 | |
26. | 156002 | 151001 | Все фотоснимки выполняются после появления всех частиц |
27. | 157004 | 152001 | Все фотоснимки выполняются после появления всех частиц |
28. | 197062 | 190001 | Все фотоснимки выполняются после появления всех частиц |
29. | 148008 | 141001 | Все фотоснимки выполняются после появления всех частиц |
30. | 169010 | 163501 | Все фотоснимки выполняются после появления всех частиц |
31. | 165011 | 159001 | Все фотоснимки выполняются после появления всех частиц |
32. | 185001 | 179102 | Все фотоснимки выполняются после появления всех частиц |
33. | 176001 | 168098 | Все фотоснимки выполняются после появления всех частиц |
34. | 155433 | 147234 | Все фотоснимки выполняются после появления всех частиц |
35. | 159608 | 152179 | Все фотоснимки выполняются после появления всех частиц |
36. | 165011 | 159001 | |
37. | 185001 | 179102 | |
38. | 176001 | 174000 | |
39. | 155433 | 153556 | |
40. | 159608 | 157701 | |
41. | 200000 | 1 | |
42. | 110000 | 10 | |
43. | 120000 | 50 | |
44. | 199999 | 70 | |
45. | 188888 | 100 | |
46. | 200000 | 100000 | |
47. | 199999 | 195000 | |
48. | 199999 | 100000 | |
49. | 178689 | 98276 | |
50. | 199998 | 88888 |
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
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
После прохождения монеты по трубке ширина этой трубки уменьшается на 1. Монета не может пройти по трубке ширины 0. Если монета достигла узла, из которого она не может дальше двигаться вниз, автомат останавливается и ждёт, когда в него бросят следующую монету
Изначально в каждом узле лабиринта находится по игрушке. Когда монета попадает в узел первый раз, игрушка, находящаяся в этом узле, достаётся игроку, бросившему эту монету.
Панкрату понравилась игрушка, которая находится в узле с номером \(v\).
Требуется написать программу, которая определяет, сколько монет должен бросить в автомат Панкрат, чтобы получить игрушку из узла \(v\).
В первой строке входного файла задано число \(n\) — количество узлов в лабиринте. В последующих n строках заданы описания всех узлов, в \(k\)-й из этих строк описан узел с номером \(k\).
Описание k-го узла состоит из четырех целых чисел: \(a_k\), \(u_k\), \(b_k\), \(w_k\). Если из \(k\)-го узла выходит левая трубка, то \(a_k\) — номер узла, в который она ведет (\(k\) < \(a_k\) <= \(n\)), а \(u_k\) — её ширина. Если левой трубки нет, то \(a_k\) = \(u_k\) = 0. Если из \(k\)-го узла выходит правая трубка, то \(b_k\) — номер узла, в который она ведет (\(k\) < \(b_k\) <= \(n\)), а \(w_k\) — её ширина. Если правой трубки нет, то \(b_k\) = \(w_k\) = 0.
В последней строке задано целое число \(v\) (1 <= \(v\) <= \(n\)) — номер узла, в котором находится игрушка, понравившаяся Панкрату.
Гарантируется, что во все узлы, кроме первого, входит ровно одна трубка
Выходной файл должен содержать одно число — количество монет, которое необходимо бросить в автомат Панкрату, чтобы получить игрушку, которая находится в узле \(v\). Если получить выбранную игрушку невозможно, выведите число −1.
Данная задача содержит две подзадачи. Для оценки каждой подзадачи используется своя группа тестов. Баллы за подзадачу начисляются только в том случае, если все тесты из этой группы пройдены.
1 <= \(n\) <= 100
1 <= \(u_k\); \(w_k\) <= 300
Подзадача оценивается в 50 баллов.
1 <= \(n\) <= \(10^5\)
1 <= \(u_k\); \(w_k\) <= \(10^9\)
Подзадача оценивается в 50 баллов.
В первом примере первая монета пройдет лабиринт по следующему пути, и игрок получит игрушки из вершин 1, 3 и 4:
Вторая монета пройдет лабиринт по следующему пути, и игрок получит игрушки из вершин 2 и 6:
Третья монета пройдет лабиринт по следующему пути, и игрок получит игрушки из вершин 5 и 7:
7 2 1 3 2 0 0 6 3 4 1 5 1 0 0 0 0 7 2 0 0 0 0 0 0 0 0 0 0 5
3
4 0 0 2 1 4 1 3 1 0 0 0 0 0 0 0 0 3
-1