346. Победитель олимпиады

Не решаласьСредняя

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

Все соревнования проводятся по одним и тем же правилам. Участник отправляет вариант решения для выбранной задачи на проверку и получает один из пяти вариантов ответа от сервера:

  • OK — правильное решение;
  • CE — участник допустил синтаксическую или семантическую ошибку при реализации, данные варианты решения игнорируются проверяющей системой;
  • WA — участник допустил ошибку в алгоритме решения задачи;
  • TL — решение участника недостаточно эффективно и работает слишком долго;
  • RE — в процессе работы программы произошла ошибка.

Вердикт OK означает, что участник успешно решил задачу. Вердикт CE игнорируется поисковой системой и не считается ни правильным, ни неправильным. За каждую решенную задачу начисляется штраф, равный числу минут, прошедшему с начала соревнования до первой успешной попытки решения (вердикта OK). Все попытки решения задачи после первой успешной игнорируются. Дополнительно при успешном решении задачи начисляется штраф, равный количеству неправильных попыток, умноженных на 20 штрафных минут. При подсчете неправильных попыток не учитывается вердикт CE. Общий штраф участника равен сумме штрафов за все задачи, которые были решены. Если по задаче не было успешных посылок, за нее не назначается дополнительный штраф.

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

Формат ввода

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

Взаимодействие с сервером можно осуществлять следующими методами:

  1. GET /view/participants — позволяет получить список участников чемпионата.

Каждый участник характеризуется объектом participant, в котором есть ровно одно поле login — его логин. Логин представляет собой строку, состоящую из прописных и заглавных латинских букв, цифр и символа _. У разных участников не может быть совпадающих логинов. Длина каждого логина не превосходит десяти символов.

Список участников возвращается в формате XML в виде объекта participants, который является массивом объектов participant. Гарантируется, что в чемпионате будет хотя бы один участник и что суммарное число участников не превосходит 500.

Пример: при вызове метода

GET /view/participants?contest=backend_contest

возможен следующий ответ:

<?xml version="1.0" encoding="UTF-8"?>
<participants>
    <participant login="polycarp" />
    <participant login="bytecarp" />
</participants>
  1. GET /view/submissions — позволяет получить список посылок конкретного участника. Для вызова метода нужно передать в параметр login логин участника.

Каждая посылка характеризуется объектом submission, в котором есть три поля:

  • timestamp — число минут, прошедших после начала соревнования, за которое участник отправил данный вариант решения;
  • problem — идентификатор задачи, является заглавной буквой латинского алфавита;
  • verdict — один из пяти вердиктов, описанных выше.

Список посылок возвращается в формате XML в виде объекта submissions, который является массивом объектов submission. Гарантируется, что суммарное количество посылок от всех участников не превышает $10^5$, а число минут, за которое была сделана посылка, удовлетворяет неравенству $0 \leq timestamp \leq 14400$.

Пример: при вызове метода

GET /view/submissions?contest=backend_contest\&login=polycarp

возможен следующий ответ:

<?xml version="1.0" encoding="UTF-8"?>
<submissions>
    <submission timestamp="63" problem="A" verdict="OK" />
    <submission timestamp="18" problem="B" verdict="WA" />
</submissions>

Запросы к серверу делаются по адресу: http://127.0.0.1:7777/. Не пытайтесь подключиться к серверу до того, как получите название соревнования. У входного потока нет признака конца файла, поэтому из него нельзя читать больше одной строки.

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

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

Примечание

Для решений на языке Python доступны библиотеки requests и urllib.

Для решений на языке C++ доступна библиотека libcurl. Соответствующая директива include выглядит так:

#include <curl/curl.h>

Для решений на языке Golang доступны все стандартные пакеты, включая net/http, sort и другие.

Версию сервера для локального тестирования можно скачать по ссылке: https://disk.yandex.ru/d/MquCh2Pe_4ERIA. Для запуска сервера стоит использовать следующую команду:

python3 winner_server.py input.txt,

где input.txt — файл входных данных в том же формате, что дан в примере.

Ограничения

Ограничение времени

4 с

Ограничение памяти

256 МБ

Пример 1

Ввод
backend_contest
2
monocarp
1
70 A OK
polycarp
2
18 B WA
63 A OK
Вывод
1
polycarp

Теги

Нужно войти, чтобы отправить решение.Войти