2017-2018 ACM-ICPC, NEERC, Восточно-сибирский четвертьфинал
A. Паника
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Ваш одногруппник Вася устроился в службу экстренного реагирования МЧС. Когда в городе что-то происходит, люди с места происшествия отправляют в эту службу SMS-сообщения. Если сообщение имеет вид «AAA...!!!!», то есть его можно разбить на две непустые половинки так, что левая состоит только из заглавных букв A, а правая — только из восклицательных знаков, то оно считается паническим, и на место этого происшествия группа реагирования отправляется в первую очередь. Если сообщение не паническое, то группа реагирования отправляется на место этого происшествия только тогда, когда нет других происшествий с паническими сообщениями.

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

Входные данные

Ввод содержит непустую строку из заглавных и строчных символов латинского алфавита, а также знаков ! и ?. Длина строки не превышает 100.

Выходные данные

Выведите «Panic!» (без кавычек), если сообщение паническое, или «No panic» (без кавычек), если оно не паническое.

Примеры
Входные данные
AAA!!!
Выходные данные
Panic!
Входные данные
AAA
Выходные данные
No panic
Входные данные
aaa!!!
Выходные данные
No panic

B. Блокчейн
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Шахтёр Василий заинтересовался криптовалютой SillyCoin. Майнеры этой валюты получают расписание блоков на следующие сутки. Для каждого блока известен промежуток времени, в течение которого его потребуется майнить, и вознаграждение в монетках SillyCoin, которое гарантированно выдаётся, если этот блок непрерывно майнился в указанное время. Майнер решает сам, стоит ли браться за майнинг того или иного блока. Майнинг следующего блока можно начинать в ту же секунду, как закончена обработка предыдущего блока. У Василия всего одного видеокарта, поэтому он не может майнить несколько блоков одновременно. Кроме того, Василию регулярно приходят счета за электричество, которое придётся оплачивать за фактически потраченное на майнинг время по фиксированному тарифу. Василий хочет узнать, выгодно ли ему заниматься майнингом, поэтому он просит вас написать программу, вычисляющую по заданному расписанию блоков максимально возможную выгоду.

Входные данные

В первой строке находятся два целых числа N и C (1 ≤ N < 86 400, 0 ≤ C ≤ 1000), разделённых пробелом, — количество блоков в расписании и стоимость электричества, затрачиваемого за каждую секунду майнинга, в монетках. В следующих N строках содержится расписание блоков на следующие сутки.

В каждой строке через пробел указаны время начала и окончания блока (в формате HH:MM:SS от 00:00:00 до 23:59:59 с разницей минимум в 1 секунду) и вознаграждение P (0 ≤ P ≤ 105) в монетках.

Выходные данные

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

Примеры
Входные данные
4 0
03:00:00 10:10:00 20
01:00:00 02:30:00 50
16:10:00 19:00:00 100
02:30:00 22:00:00 200
Выходные данные
250
Входные данные
3 1
16:59:00 17:00:00 100
01:01:01 01:01:11 20
12:00:00 13:00:00 3601
Выходные данные
51
Входные данные
4 10
00:00:05 00:01:55 1100
00:00:10 00:00:21 100
00:01:50 00:02:00 80
23:59:00 23:59:05 40
Выходные данные
0

C. Кроссворд
ограничение по времени на тест
3 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

Но и это не всё! Пустого места должно быть не слишком много, но и не слишком мало, чтобы его можно было заполнить рекламой.

Вам даны четыре слова. Сколькими способами можно составить из них кроссворд, чтобы внутри образовалась пустая область в виде прямоугольника, ни одна из сторон которого не равна 0? Каждое слово должно пересекаться с ровно двумя другими словами.

Входные данные

Ввод содержит 4 слова, находящиеся в отдельных строках.

Каждое слово имеет длину от 3 до 100 и состоит только из малых букв латинского алфавита.

Все слова различны.

Выходные данные

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

Примеры
Входные данные
aaa
axa
aya
aza
Выходные данные
24
Входные данные
aaaa
abba
baab
bbbb
Выходные данные
40

D. Defense of the ACM
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Тёмные времена нависли над ACM-ом. Тысячи команд ACM-щиков вышли на защиту от нападения CTF-щиков. Всего имеется N команд, пронумерованных от 1 до N. Каждая команда, по традиции, состоит из трёх человек. Каждому человеку присвоили параметр ACM-овости, выраженный целым числом.

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

Так как ACM-щики по своей натуре любят усложнять задачи не пойми зачем, они решили рассмотреть несколько отрезков [li, ri], составляя армию лишь из команд с номерами из этого отрезка.

Собственно, ваша команда отвечает за обработку этих запросов. На горизонте уже видны флаги, у вас осталось меньше пяти часов!

Входные данные

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

В следующих N строках содержится описание каждой команды в виде трёх целых чисел. ACM-овость каждого человека является целым числом от 0 до 109.

Следующая строка содержит целое число M — количество отрезков (1 ≤ M ≤ 300 000).

В следующих M строках идёт описание каждого запроса в виде пары чисел li и ri (1 ≤ li ≤ ri ≤ N).

Выходные данные

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

Примеры
Входные данные
2 2
0 1 3
1 2 3
3
1 1
2 2
1 2
Выходные данные
0
2
6
Входные данные
3 3
0 3 6
1 4 7
1 2 3
4
1 1
1 2
1 3
2 2
Выходные данные
6
-1
15
-1

E. Таблица
ограничение по времени на тест
0.5 секунд
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

В бесконечной таблице по номеру строки и столбца определить элемент

Входные данные

Два натуральных числа a, b — номер строки и столбца соответственно. Числа не превосходят 109.

Выходные данные

Выведите одно натуральное число — ответ на задачу.

Пример
Входные данные
2 3
Выходные данные
8

F. Report builder
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

В каждом крупном городе есть региональное отделение этой службы. Региональные отделения ежедневно отслеживают значения показателей и записывают их в базу данных. Например, 21 октября в Красноярск прибыло 100 человек для участия в олимпиаде по программированию. А 23 октября 90 человек уехали обратно (кому-то так понравилось в Красноярске, что они решили тут остаться).

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

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

Входные данные

Первая строка содержит целое число N — количество городов с региональными отделениями службы. Далее идет N наборов данных для каждого города.

Первая строка набора данных для города содержит название города и количество показателей A[i], отслеживаемых для этого города. Далее идет A[i] наборов данных для каждого показателя.

Первая строка набора данных для показателя содержит название показателя и количество дат, на которые известны значения этого показателя. В следующих строках идут пары - дата в формате YYYY-MM-DD и значение (целое число, по модулю не более 10 000).

Названия городов и показателей — непустые строки из заглавных и строчных латинских букв, не более 10 символов. Всего в базе хранится не более 100 000 значений.

После описания базы данных идет целое число M — количество требуемых отчетов (не более 100). Описание параметров каждого отчета состоит из 6 строк:

  1. Тип отчета — строка indicator или city. Отчет по показателю или по городу.
  2. Название показателя или города, соответственно.
  3. Для отчета по показателю —- количество городов, которые нужно включить в отчет, а далее названия городов. Если указана строка all, то в отчет нужно включить все города. Для отчета по городу — количество показателей, которые нужно включить в отчет, а далее названия показателей. Если указана строка all, то в отчет нужно включить все показатели этого города.
  4. Период, за который нужны данные. Задается датой начала и датой конца в формате YYYY-MM-DD.
  5. Аналитическая операция — sum, min, max или count. Возвращаем сумму, минимум, максимум или количество значений за запрашиваемый период.
  6. Порядок сортировки. Может быть name - по имени объекта/показателя или value — по итоговому значению . Так же может быть указан необязательный параметр desc — сортировка по убыванию. В случае сортировки по итоговому значению строки с одинаковым значением всегда сортируются по названию объекта/показателя.
Выходные данные

Для каждого отчеты вывести Report < index > :  , где  < index >  — порядковый номер отчета, начиная с единицы.

Далее для каждого объекта/показателя в отчете в отдельной строке вывести его название и итоговое значение. Все строки должны быть отсортированы в соответствии параметрами отчета. Если за требуемый период нет ни одного значения показателя - вместо значения вывести символ «-».

Пример
Входные данные
2
Krsk 3
Arrive 1
2017-10-21 100
Depart 1
2017-10-23 90
Increase 3
2017-10-21 100
2017-10-22 0
2017-10-23 -90
Irk 2
Depart 1
2017-10-20 70
Arrive 1
2017-10-24 80
2
indicator
Increase
all
2017-10-20 2017-10-23
sum
value desc
city
Irk
2 Increase Arrive
2017-10-20 2017-10-24
max
name
Выходные данные
Report 1:
Krsk 10
Irk -
Report 2:
Arrive 80
Increase -

G. Цифра
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Проснувшись ранним утром, Сашка понял, что давно не проведывал своего старого друга - Витальку. Решив не откладывать это дело на следующий день, он начал собираться в гости. Сашка уже стоял на пороге своей квартиры, как понял, что у него нет подарка! Зная слабость Витальки к цифрам, он решил подарить ему самую часто встречающуюся цифру в записи чисел от 1 до N, причем если таких несколько, было решено взять максимальную. Сможете ли Вы определить, какую цифру подарил Сашка своему другу?

Входные данные

В единственно строке задано целое число N (1 ≤ N ≤ 10100000).

Выходные данные

Выведите цифру, которую подарил Сашка.

Примеры
Входные данные
100
Выходные данные
1
Входные данные
99
Выходные данные
9

H. HTML
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Разметка HTML содержит ноль или более вложенных элементов и текст (в рамках условия дана упрощенная версия реального HTML, и он всегда корректен):


1. <html>
2. <input type="button" id="x" />
3. <div id="x"class='cls'p="<i/>">
4. hello <b>world</b> id='x'
5. </div>
6. </html>

HTML-код может содержать символы английского алфавита, символы "<>=/", а также кавычки ' и ". Также так называемые пробельные символы: пробелы, переводы строк и табуляцию. Все входные символы в задаче будут в нижнем регистре.

В данном примере веб-страница содержит элементы, обозначаемые тегами <html>, <input>, <div>, <b>, а также текст "hello", "world" и "id='x'" внутри элементов. Теги состоят из объявления тега и опционально, закрытия тега. Рассмотрим тег tag:

  • Объявление тега состоит из начала объявления – "<tag" и конца объявления — "/>" либо ">". Между началом и концом объявления может находиться ноль или более пробельных символов, а также атрибуты тега (см. ниже).
  • Если тег содержит внутри себя другие теги или текст длиной ноль или более символов (как <html>, <b> или <div> из примера), то конец объявления тега — это ">". Такой тег называют открытым. Если не содержит (как тег "<input>" из примера), то конец объявления тега - это "/>", и такой тег называют замкнутым.
  • Открытый тег всегда закрывается как "</tag>" — как на строчках 4, 5, 6. Замкнутые теги не закрываются.
  • между началом и концом объявления тега могут находиться атрибуты. Каждый атрибут имеет значение. Например, "<input>" имеет два атрибута — "type" со значением "button" и "id" со значением "x". Атрибуты записываются как "attr="val"" или "attr='val'" — закрывает значение та же кавычка, что и открывает. Название атрибута и его значение разделяется только символом '=' без пробелов. Название атрибута — один или более символов английского алфавита в нижнем регистре. На значения атрибутов накладывается единственное ограничение - они не могут содержать открывающую/закрывающую кавычку значения атрибута. Между атрибутами, а также атрибутами и началом объявления тега, атрибутами и концом объявления тега может быть ноль или более пробельных символов.

Вам нужно написать программу, которая по заданному HTML-коду и трем типам селекторов выдаст количество элементов на странице, соответствующих селекторам:

  • "html" — возвращает все элементы <html> со страницы.
  • "#myid" — возвращает все теги, где имеется атрибут id со значением myid.
  • ".cls" — возвращает все теги, где имеется атрибут "class" со значением "cls".
Входные данные

Первая строка содержит число n - количество селекторов (как минимум один). Далее следуют n строк без пробелов в начале и конце, которые обозначают селекторы s1, ..., sn, по которым Вам нужно сделать запросы. Селекторы содержат один или более символов английского алфавита и/или символы ".#'. Далее до конца входа находится непустой HTML-код. Общая длина входных данных не превышает 5 000 символов. Все символы во входе находятся в нижнем регистре.

Выходные данные

Для каждого запроса s1, ..., sn напечатайте ответ на отдельной строке, содержащий селектор и количество элементов HTML-страницы, ему соответствующих. См. пример выходных данных.

Пример
Входные данные
5
html
#x
.cls
#fakeid
i
<html>
<input type="button" id="x" />
<div id="x"class='cls'p="<i/>">
hello <b>world</b> id='x'
</div>
</html>
Выходные данные
Selector "html": found 1 elements
Selector "#x": found 2 elements
Selector ".cls": found 1 elements
Selector "#fakeid": found 0 elements
Selector "i": found 0 elements
Примечание

Обратите внимание, что в качестве примера входных данных используется HTML-страница из условия.

I. OpenAI XO
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Это интерактивная задача.

В недалёком будущем OpenAI бот уже выигрывает у человека почти во всех играх. Чтобы не дать боту захватить мир вам нужно написать программу, которая даст отпор при игре в классические крестики-нолики.

Напомним правила этой игры: игроки ходят по очереди, выставляя на клетчатом поле 3 на 3 свой символ (X или O — заглавные латинские буквы). Ходить можно только в свободную клетку. Если после хода образовалось 3 одинаковых символа в ряд (по вертикали, горизонтали или диагонали), игрок, которому принадлежит символ, выигрывает. Если такого не произошло, но при этом нет свободных клеток, то в игре объявляется ничья.

OpenAI бот всегда играет за нолики, Вы — за крестики. Ваша цель — не проиграть боту, glhf!

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

В самом начале в первой строке ввода задаётся, кто ходит первым.

Далее происходит общение. Если ход за ботом, то он сообщает вам координаты клетки, в которую походил в виде пары чисел r и c, означающих номер строки и столбца. Строки нумеруются от 1 до 3 сверху вниз, а столбцы от 1 до 3 слева направо. Каждый ход выводится в отдельной строке, числа разделены одним пробелом. Гарантируется, что ходы бота корректны.

Если ход за вами, то Вы должны вывести в аналогичном формате координаты клетки хода.

Как только игра заканчивается, вам немедленно сообщается результат игры в виде строки «WIN» (вы выиграли), «LOSE» (вы проиграли) или «DRAW» (ничья).

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

Примеры
Входные данные
X
1 3
2 3
WIN
Выходные данные
1 1
2 1
3 1
Входные данные
O
1 1
3 1
2 3
1 2
2 2
DRAW
Выходные данные
3 3
1 3
2 1
3 2
Примечание

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

  • В языке Pascal: flush(output);
  • В С/С++: fflush(stdout) или cout.flush();
  • В Java: System.out.flush();
  • В Python: sys.stdout.flush() из библиотеки sys;
  • В C#: Console.Out.Flush();

J. ПСП
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Андрей любит строки, которые состоят из круглых скобок, но еще больше он любит заменять скобки на точки.

У него есть строка длины N, к которой он применяет M операций. Каждая операция задается двумя натуральными числами li и ri, в результате операции в подстроке slisli + 1, ..., sri самая длинная правильная скобочная подпоследовательность (далее ПСП) заменяется на точки (каждая скобочка заменяется на точку).

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

Если в подстроке есть несколько ПСП максимальной длины, то выбирается наименьшая. Правило сравнения следующие: пусть a1, a2, ... , al  — позиции открывающихся скобок первой ПСП, а c1, c2, ..., cl  — позиции открывающихся скобок второй ПСП. Считается, что первая ПСП меньше второй, если существует k (1 ≤ k ≤ l), такое что ai = ci (1 ≤ i < k) и ak > ck.

Если позиции открывающихся скобок обоих ПСП совпали, то сравниваются позиции закрывающихся скобок по следующему правилу: пусть b1, b2, ..., bl  — позиции закрывающихся скобок первой ПСП, а d1, d2, ..., dl  — позиции закрывающихся скобок второй ПСП. Считается, что первая ПСП меньше второй, если существует k (1 ≤ k ≤ l), такое что bi = di (1 ≤ i < k) и bk < dk.

Входные данные

На первой строке задается исходная строка S длины N (1 ≤ N ≤ 5 × 105), которая состоит из открывающихся и закрывающихся круглых скобок.

На второй строке задается натуральное число M (1 ≤ M ≤ 5 × 105)  — количество операций.

В следующих M строках задаются операции, каждая строка состоит из двух натуральных чисел li и ri (1 ≤ li ≤ ri ≤ N)  — левая и правая граница подстроки соответственно.

Выходные данные

Для каждой операции на отдельной строке выведите единственное число  — число скобок, которые были заменены на точки.

Пример
Входные данные
(((())()))
3
4 9
2 8
1 10
Выходные данные
4
2
4

K. Буратино
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

У Буратино было N яблок. Некто дал Буратино A яблок. Буратино съел B яблок. Сколько яблок осталось у Буратино?

Входные данные

Два натуральных числа A и B (1 ≤ A, B ≤ 1015)

Выходные данные

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

Примеры
Входные данные
2 1
Выходные данные
N+1
Входные данные
2 3
Выходные данные
N-1