Окружная олимпиада(18 задач)
Региональный этап(109 задач)
Заключительный этап(97 задач)
Как известно, футбольные матчи — это не просто спортивное состязание, но и возможность выиграть немного денег, удачно предсказав результаты матчей. В преддверии чемпионата мира по футболу Вася решил попытать счастья и сделать ставку на финальную игру, но тут же столкнулся с проблемой: любая команда, участвующая в чемпионате, по его расчетам могла бы выиграть в финале, а значит шансов угадать команду-победителя крайне мало.
Чтобы облегчить себе задачу, Вася решил обратиться за помощью к прославленному игроку на тотализаторе осьминогу Паулю. Дело в том, что Вася знает, как осьминог делает свои безошибочные предсказания. Перед началом соревнований Пауль каким-то образом делит команды на три группы по силе: самые сильные команды, средние и самые слабые. Чтобы спрогнозировать результат игры, Пауль смотрит на силу команд, принимающих участие в матче. Если команды находятся в разных по силе группах, он выбирает команду, из более сильной с его точки зрения группы, иначе осьминог просто не знает, какая команда победит.
Для того, чтобы сделать точный прогноз на финальный матч, Вася очень хочет узнать, как же именно Пауль разбивает команды на группы по силе. Немного подумав, мальчик понял, что разбиение возможно восстановить по прогнозам осьминога. Для этого достаточно несколько раз задать ему вопрос вида: "Сильнее или слабее команда a чем команда b". К сожалению, Вася может задать осьминогу ограниченное число вопросов (не более 106), иначе Пауль догадается, что мальчик хочет раскрыть его секрет.
Если осьминог понимает, что из его предыдущих ответов ясно следует ответ на текущий вопрос, то он впадает в ярость и крушит всё подряд.
Это — интерактивная задача. На стандартный вход участнику подается единственное число N(1 ≤ N ≤ 100000) — количество команд-участников в чемпионате. Затем участник начинает "общение" с осьминогом Паулем: необходимо последовательно подавать на стандартный поток вывода запросы вида a b, где a и b - номера команд, чье соотношение сил хочет узнать Вася (числа a и b должны быть разделены ровно одним пробелом, после числа b должен быть поставлен перенос строки). В ответ на запрос на стандартный поток ввода подается одно число — либо 1, если команда a сильнее команды b, либо -1, если команда a слабее, либо 0, если осьминог не знает какая команда победит. Участник должен считать данное число и вывести следующий запрос. Если программа делает запрос, ответ на который следует из предыдущих, то она завершается и ответ считается неверным.
Когда программа участника восстановила исходное разбиение команд по группам, то вместо запроса нужно вывести на стандартный поток вывода одно число 0, затем само разбиение в 4-х строках, где: в первой строке должно быть записано одно число - количество команд в самой сильной группе, во второй - команды, составляющие собой сильнейшую группу в произвольном порядке, в третьей - количество команд во второй по силе группе, в четвертой - команды, составляющие собой вторую по силе группу в произвольном порядке. Все числа должны быть отделены друг от друга ровно одним пробелом. В конце файла должен стоять перенос строки. После вывода распределения команд программа должно завершаться.
При выводе запросов следует пользоваться следующими фрагментами:
{язык Pascal/Delphi}
writeln(a, ' ', b); // вывод запроса.
flush(output);
//язык C
printf("%d %d\n", a, b);
fflush(stdout);
//язык C++
cout ≤≤ a ≤≤ " " ≤≤ b ≤≤ endl ≤≤ flush;
3
-1
-1
1 2
2 3
Пример общения программы участника с осьминогом Паулем:
3 число команд, поступает на вход решению
1 2 первый запрос
-1 ответ
2 3 второй запрос
-1 ответ
0 решение говорит о том что распределение команд установлено
1 число команд в самой сильной группе
3 список команд в самой сильной группе
1 число команд в средней группе
2 список команд средней группы
На окружности отмечено \(2n\) различных точек, пронумерованных от 1 до \(2n\) против часовой стрелки. Петя нарисовал \(n\) хорд, \(i\)-я из которых соединяет точки с номерами \(a_i\) и \(b_i\). При этом каждая точка является концом ровно одной хорды.
Теперь Петя заинтересовался, сколько пар хорд пересекаются. Помогите ему определить это количество.
Первая строка входных данных содержит целое число \(n\) — количество проведенных хорд (\(1\le n\le 10^5\)). Следующие \(n\) строк содержат по два целых числа — \(a_i\) и \(b_i\).
Выведите одно число — количество пар хорд, которые пересекаются.
Решения, которые работают только для \(n < 2000\), будут оцениваться из 40 баллов.
3 1 4 2 5 3 6
3
2 1 2 3 4
0
2 1 4 2 3
0
На аллее перед зданием Министерства Обороны в ряд высажены \(n\) дубов. В связи с грядущим приездом главнокомандующего, было принято решение срубить несколько деревьев для придания аллее более милитаристического вида.
Внутренние распорядки министерства позволяют срубать дуб только в двух случаях:
* Если и ближайший дуб слева, и ближайший дуб справа строго ниже, чем данный дуб.
* Если и ближайший дуб слева, и ближайший дуб справа строго выше, чем данный дуб.
В частности, согласно этому правилу, нельзя срубить крайний левый и крайний правый дуб.
Министр хочет выработать такой план вырубки, чтобы в итоге осталось несколько дубов, высоты которых образуют неубывающую последовательность, то есть чтобы каждый дуб был не ниже, чем все дубы, стоящие слева от него. При этом, как человек любящий флору, министр хочет, чтобы было срублено минимальное возможное количество деревьев.
Помогите сотрудникам министерства составить оптимальный план вырубки аллеи или выяснить, что срубить дубы соответствующим образом невозможно.
Первая строка входного файла содержит целое число \(n\) — количество дубов, растущих на аллее (\(2\le n \le 200\)). Вторая строка содержит \(n\) чисел — высоты дубов, приведенные слева направо. Высоты дубов — положительные целые числа, не превышающие 1000.
Если оставить последовательность дубов с неубывающими высотами невозможно, выходной файл должен содержать только одно число \(-1\).
В случае, если искомый план существует, в первую строку выходного файла выведите целое число \(m\) — минимальное количество дубов, которые необходимо срубить. В следующие \(m\) строк выведите оптимальный план вырубки деревьев — номера дубов в том порядке, в котором их следует срубать, по одному номеру на строке.
Дубы нумеруются слева направо натуральными числами от \(1\) до \(n\).
Если планов с наименьшим числом срубаемых дубов несколько, выведите любой из них.
В 50 баллов оценивается решение для случая, когда все высоты дубов попарно различны.
5 3 2 4 8 5
2 2 4
5 4 5 5 5 6
0
6 1 1 3 3 2 2
-1
6 400 300 310 300 310 500
-1
Напомним, что палиндромом называется строка, которая читается одинаково как слева направо, так и справа налево. Например, палиндромами являются строки “abba” и “madam”.
Для произвольной строки \(s\) введем операцию деления пополам, обозначаемую \(half(s)\). Значение \(half(s)\) определяется следующими правилами:
Если \(s\) не является палиндромом, то значение \(half(s)\) не определено;
Если \(s\) имеет длину 1, то значение \(half(s)\) также не определено;
Если \(s\) является палиндромом четной длины \(2m\), то \(half(s)\) — это строка, состоящая из первых \(m\) символов строки \(s\);
Если \(s\) является палиндромом нечетной длины \(2m+1\), большей \(1\), то \(half(s)\) — это строка, состоящая из первых \(m + 1\) символов строки \(s\).
Например, значения \(half(\mbox{inforamatics})\) и \(half(\mbox{i})\) не определены, \(half(\mbox{abba}) = \mbox{ab}\), \(half(\mbox{madam}) = \mbox{mad}\).
Палиндромностью строки \(s\) будем называть максимальное число раз, которое можно применить к строке \(s\) операцию деления пополам, чтобы результат был определен.
Например, палиндромность строк “informatics” и “i” равна 0, так как к ним нельзя применить операцию деления пополам даже один раз. Палиндромность строк “abba” и “madam” равна 1, а палиндромность строки “totottotot” равна 3, поскольку операция деления пополам применима к ней три раза: “totottotot” → “totot” → “tot” → “to”.
Рассмотрим все строки длины \(n\), состоящие из строчных латинских букв, палиндромность которых равна \(p\). Ваша задача — найти \(k\)-ю в алфавитном порядке среди этих строк.
В первой строке входного файла содержатся три целых числа \(n\), \(p\) и \(k\) — длина и палиндромность строк рассматриваемого множества и номер искомой строки в этом множестве (\(1 \le n \le 200\); \(0 \le p \le 8\); \(1 \le k \le 10^9\)).
Гарантируется, что в множестве строк длины \(n\) с палиндромностью \(p\) содержится не менее \(k\) элементов, то есть искомая строка существует.
В выходной файл выведите \(k\)-ю в алфавитном порядке строку из множества строк длины \(n\) с палиндромностью \(p\).
4 1 1
abba
10 3 490
totottotot
5 0 6597777
olymp
В театре работает \(n\) актеров. Известно, что среди них \(a\) – высоких, \(b\) – голубоглазых и \(с\) – блондинов. Для главной роли в новом спектакле режиссеру требуется только один высокий голубоглазый блондин. Чтобы спланировать свое время для беседы с каждым таким артистом из труппы театра, режиссеру необходимо узнать, какое максимальное или какое минимальное количество артистов из работающих в театре подходит для этой роли.
Требуется написать программу, которая по заданным числам \(n\), \(a\), \(b\) и \(с\) определяет минимальное или максимальное количество актеров, с которыми режиссер должен переговорить.
Первая строка входного файла содержит одно число, которое задает, минимальное или максимальное количество актеров необходимо найти в данном тесте. Это число может принимать следующие значения:
Выходной файл должен содержать одно число – минимальное или максимальное (в зависимости от входных данных) количество актеров, которые могут претендовать на главную роль в новом спектакле.
Правильные решения для тестов, в которых требуется найти минимальное количество актеров, будут оцениваться из 50 баллов.
Правильные решения для тестов, в которых требуется найти максимальное количество актеров, будут оцениваться из 50 баллов.
Несмотря на выделение отдельных групп тестов для минимального и максимального количества артистов, на окончательную проверку будут приниматься только решения, правильно работающие для всех тестов из условия задачи.
2 5 3 4 5
3
1 5 3 4 5
2