Объединение команд и подсчёт рейтинга на Python

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Collections в Python: задачи на ChainMap, defaultdict и deque.

Командный турнир настольного фехтования

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

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

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

Что уже дано

Предоставленная заготовка считывает из потока ввода числа n и q, формирует список кортежей fighters вида (fighter, guild, rank) и сохраняет список событий events, где каждое событие представлено списком из трёх строк. Никаких скрытых файлов или предварительно вычисленных значений в программе нет.

Что нужно сделать

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

Правила турнира:

  • В начале у каждого фехтовальщика 0 побед, а его ранг остаётся постоянным до конца турнира.
  • Активными вначале считаются все гильдии, указанные у фехтовальщиков.
  • При событии DUEL winner loser боец winner получает 1 победу. Победы loser не уменьшаются. Фехтовальщики могут принадлежать одной и той же гильдии.
  • При событии MERGE guild1 guild2 объединяются две действующие гильдии. Выживает гильдия, чьё имя лексикографически меньше, независимо от порядка аргументов. Все бойцы упраздняемой гильдии вместе со всеми накопленными победами переходят в выжившую гильдию, а упразднённая гильдия окончательно исчезает из турнира и больше не встречается в событиях MERGE.
  • Очки активной гильдии считаются строго независимо от остальных: найдите максимальный ранг среди её текущих участников и просуммируйте накопленные победы бойцов только этого ранга. Очки бойцов более низких рангов в зачёт не идут.
  • Лидером становится активная гильдия с наибольшим количеством очков зачёта. Если у нескольких гильдий максимальное количество очков совпадает, лидером признаётся гильдия с лексикографически наименьшим именем. Учитываются в том числе нулевые результаты.

Ввод и вывод

Программа взаимодействует с проверяющей системой через стандартные потоки stdin и stdout.

Формат ввода

Первая строка содержит два целых числа: n (количество бойцов, от 1 до 30) и q (количество событий, от 0 до 100). Следующие n строк содержат данные бойцов через пробел: имя фехтовальщика, название гильдии и целочисленный ранг от 1 до 100. Имена бойцов и названия гильдий состоят из 1–12 строчных латинских букв (ASCII a-z) без пробелов. Имена бойцов уникальны; названия гильдий могут повторяться, если в клубе состоит несколько бойцов. Следующие q строк содержат описания событий. Все входные события гарантированно корректны, обработка ошибок ввода не требуется:

  • DUEL winner loser — поединок между двумя различными существующими бойцами winner и loser.
  • MERGE guild1 guild2 — объединение двух различных текущих активных гильдий guild1 и guild2.

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

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

Пример

Ввод
4 5
ira oak 3
leo oak 1
mia ash 2
noa elm 3
DUEL mia ira
DUEL leo noa
MERGE oak ash
DUEL ira noa
DUEL noa ira
Вывод
ash 1
ash 1
ash 0
ash 1
ash 1
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи