Разбор задач Looksery Cup 2015

Revision ru20, by Monyura, 2015-06-06 20:34:33

A. Определение лиц

Автор: Monyura

Для решения этой задачи следует перебрать все квадраты 2х2 и проверить, что переставив буквы можно получить слово "face". Это можно удобно сделать, например, отсортировав буквы квадрата в алфавитном порядке и проверив, что отсортированное множество равно "acef"(Отсортированный порядок букв слова "face").

B. Вечеринка в Looksery

Автор: Igor_Kudryashov

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

Ни одно из чисел, предложенных Игорем, не равно нулю. Тогда если никто не придет на вечеринку, то всем сотрудникам придет по 0 сообщений, и, следовательно, искомое множество — это пустое множество.

Хотя бы одно из чисел Игоря равно нулю. Пусть он предполагает, что i-ому сотруднику достанется 0 сообщений. В этом случае добавим i-ого сотрудника в искомое множество. Он разошлет сообщения всем своим контактам и у него самого количество пришедших сообщений станет равно 1. При добавлении других сотрудников в искомое множество, количество сообщений, пришедших i-ому не уменьшится, а, значит, его можно удалить из рассмотрения. Для людей из списка контактов i-го сотрудника Игорь предсказал некоторые количества сообщений, и т.к. по одному сообщению этим людям уже пришло, из желаемых Игорем чисел нужно вычесть единицу. После этого можно перейти к той же задаче, считая что у нас имеется n - 1 сотрудников. Если оставшееся количество сотрудников равно 0, то искомое множество построено.

C. Игра чётности

Автор: olpetOdessaONU

Если n = k, то ни один ход не может быть совершен. Победитель определяется изначальной суммарной четностью количества жителей. Иначе заметим, что игрок, который делает ход последним, может гарантировать себе победу, если на момент его последнего хода остаются как четные, так и нечетные города — он просто выберет, город с какой четностью сжечь, чтобы получить нужную итоговую четность. Поэтому задача его противника — уничтожить все города какого-то одного типа. Иногда все равно какого, а иногда — нет, это зависит от имени игрока и четности k. Поэтому дальнейшее решение задачи заключается в сравнении количества ходов (n - k) / 2 «непоследнего» игрока с количествами четных и нечетных городов — хватит ли ходов, чтобы их уничтожить. Если последним ходит Станнис, то, в случае четного k, Дейнерис должна сжечь все четные либо все нечетные города. В случае нечетного k, Дейнерис следует сжечь все нечетные города. Если последней ходит Дейнерис, то, в случае четного k ее противник не имеет шансов на победу, а, в случае нечетного k, Станнис должен сжечь все четные города.

D. Признаки Хаара

Автор: Monyura

Эта задача имела сложное условие, но максимально близкое к реальности.

Один из вариантов решения задачи состоит в изучении структуры ответа. Предположим, что у нас есть ответ, т.е последовательность операций: взятие сумм на префикс-прямоугольнике и коэффициентов, на который умножается сумма. Мы можем менять порядок операций, значение признака при этом меняться не будет. Тогда отсортируем операции по правому нижнему углу прямоугольника. Будем применять операции начиная от последний к первой. Решение состоит в том, что бы не применять операции, которые не нужны и применить все те, которые мы обязаны применить. Для этого для каждого пикселя будем поддерживать коэффициент с которым он сейчас входит в значение признака. Изначально этот коэффициент равен 0. Пройдем по каждому пикселю начиная с нижнего правого угла. Если текущий коэффициент не равен  + 1 для пикселя покрытого W и  - 1 для пикселя покрытого B, то пиксель входит в значение признака с неправильным коэффициентом и нам надо его поменять, для этого используем одну операцию. Единственный способ поменять значение этого пикселя теперь, после того как все большие и по ряду и по столбцу просмотрены — это взять сумму на префикс-прямоугольнике с правым нижним углом в этом пикселе. Предположим значение коэффициента должно быть X ( + 1 или  - 1 в зависимости от цвета), а сейчас равно C. Тогда мы должны прибавить сумму на прямоугольнике с коэффициентом X - C к значению признака. Но сделав это, мы так же прибавим X - C к коэффициентам всех пикселей на префикс-прямоугольнике. Это решение может быть реализовано так, как описано за O(n2m2) или за O(nm).

Так же хочется добавить, что от настоящих признаков Хаара данное определение отличается только тем, что настоящие применяются к региону изображения, а не ко всему изображению. Но минимальное число операций можно посчитать по такому же принципу.

E. Саша Круг

Авторы: Krasnokutskiy, 2222

Скоро появится.

F. Юра и разработчики

Автор: Rubanenko

Посмотрим на следующее решение:

Пусть f(l, r) — это решения для подмассива [l, r]. Легко заметить, что f(1, n) — это ответ на поставленную задачу. Как считать f(l, r)? Пусть m — это индекс максимального элемента подмассива [l, r]. Все

Unable to parse markup [type=CF_TEX]

подмассивы могут быть разбиты на два непересекающихся множества: те, которые содержат m, и те которые его не содержат. Чтобы посчитать последние можно просто вызвать f(l, m - 1) и f(m + 1, r). Осталось посчитать количество "хороших" подмассивов, которые содержат m, другими словами, количество пар (i, j), что l ≤ i < m < j ≤ r и g(i, m - 1) + g(m + 1, j)%k = 0 (g(s, t) озанчает as + as + 1 + ... + at). Пусть s — это последовательность частичных сумм массива из условия, то есть si = a1 + a2 + ... + ai. Для всех j нам интересно количество i, что sj - si - am%k = 0, так что если мы переберем все возможны j, то нам интересно количество таких i, что si = sj - am(modk) и l ≤ i < m. Имеем ряд запросов на отрезве вида "сколько есть чисел на отрезке (l, r), что они равны x". Это можно сделать за O(q + k) времени и памяти, где q — количество запросов, которые сгенерировались в ходе рекурсивного вычисления f(1, n). Авторское решение обрабатывает эти запросы в режиме оффлайн, с помощью массива подсчета. (для лучшего понимания посмотрите код).

Можно заметить, что в худшем случае мы получим O(n2) запросов, которые очевидно не дадут уложиться в ограничения. Тем не менее, мы можем выбрать, что быстрее: перебрать все возможные j или i. В обоих случаях мы получаем просую сравнимость и запрос на отрезке, описанный выше. Если идти только по меньшему отрезку, то каждый раз, как мы "проходим" по элементу w, он переходит в отрезок, который, как минимум, в два раза меньше, чем тот, которому он принадлежал до этого. Таким образом, каждый элемент окажется в отрезке единичной длины(база рекурсии) за O(log(n)) "проходов" по нему.

Сложность алгоритма O(n × log(n) + k).

G. Счастливая очередь

Авторы: 2222, MrDindows

Давайте переформулируем условие в терминах башен определенной высоты, которые будут находиться на лестнице. Тогда количество денег соответствующего человека в очереди будет равно высоте башни вместе с высотой ступеньки, на которой башня стоит. А процесс продвижения в очереди будет эквивалентен подъему одной башни на ступеньку вверх, а та, на чье место она взошла — вниз, как показано на иллюстрации. Тогда, становиться очевидно, что чтобы все башни на ступеньках были отсортированны, достаточно отсортировать башни без учета высот ступенек. Итого сложность сортировки O(nlog(n)).

H. Вырожденная матрица

Автор: Igor_Kudryashov

У вырожденной матрицы строки линейно зависимы, а значит можно представить матрицу B в следующем виде:

Пусть

Положим, что элементы первой строки матрицы A являются координатами точки a0 на двухмерной плоскости, а элементы второй строки — координатами точки a1. Представим, что строки матрицы B также являются координатами точек b0 и b1. Заметим, что в этом случае прямая, проходящая через точки b0 и b1, также проходит через точку (0, 0).

Будем искать ответ на задачу — число d — бинарным поиском. Предположим мы зафиксировали некоторое число d0 и хотим проверить, существует ли такая матрица B, что

В геометрической интерпретации это означает, что точка b0 находится в квадрате, с центром в точке a0 и длиной стороны d0, а точка b1, соответственно, в квадрате с такой же длиной стороны и центром в a1. Таким образом, нам нужно проверить, существует ли прямая, проходящая через точку (0, 0) и пересекающая эти квадраты. Чтобы это сделать, достаточно перебрать вершины одного квадрата, построить прямую, проходящую через выбранную вершину и центр координат и проверить, что она пересекает какую-нибудь из сторон второго квадрата. Затем нужно сделать то же самое, обменяв квадраты. В итоге, если прямая нашлась, то нужно уменьшить границу поиска, иначе расширить.

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en10 English Monyura 2015-06-09 00:40:44 1 Tiny change: 'omplexity O((|A|+|B|' -> 'omplexity $O((|A|+|B|'
en9 English Monyura 2015-06-09 00:39:51 6444
ru25 Russian Monyura 2015-06-08 02:14:19 1 Мелкая правка: '}, P_0 - P{n-1}$\nОб' -> '}, P_0 - P_{n-1}$\nОб'
ru24 Russian Monyura 2015-06-08 02:13:55 2 Мелкая правка: '_0 - P{n-1]$\nОбознач' -> '_0 - P{n-1}$\nОбознач'
ru23 Russian Monyura 2015-06-08 02:12:32 6
ru22 Russian Monyura 2015-06-08 02:11:32 18995 Мелкая правка: ' + C^{4/3}$, где $С$' -
en8 English Monyura 2015-06-06 20:46:43 2 Tiny change: 'or: [user:monyura,201' -> 'or: [user:Monyura,201'
en7 English Monyura 2015-06-06 20:46:20 54 (published)
ru21 Russian Monyura 2015-06-06 20:45:32 46 (сохранено в черновиках)
ru20 Russian Monyura 2015-06-06 20:34:33 24
en6 English Monyura 2015-06-06 20:34:10 18
ru19 Russian Monyura 2015-06-06 20:32:31 0 (опубликовано)
ru18 Russian Monyura 2015-06-06 20:32:09 18
en5 English Monyura 2015-06-06 20:30:59 11
ru17 Russian Monyura 2015-06-06 20:30:31 2 Мелкая правка: 'о за $O(n^2m^2)$ или ' -> 'о за $O(n^{2}m^2)$ или '
en4 English Monyura 2015-06-06 20:29:29 640
ru16 Russian Monyura 2015-06-06 20:27:02 34
ru15 Russian Monyura 2015-06-06 20:26:08 54
en3 English Monyura 2015-06-06 20:24:55 66
en2 English Monyura 2015-06-06 20:10:05 255
ru14 Russian Monyura 2015-06-06 20:09:03 339
ru13 Russian Monyura 2015-06-06 20:05:44 3
ru12 Russian Monyura 2015-06-06 20:04:04 4 Мелкая правка: 'le="width:60%;height:60%"/>\n\n*' -> 'le="width:40%;height:40%"/>\n\n*'
ru11 Russian Monyura 2015-06-06 20:03:35 4 Мелкая правка: 'le="width:60%;height:60%"/>\n<im' -> 'le="width:40%;height:40%"/>\n<im'
ru10 Russian Monyura 2015-06-06 20:03:06 40
ru9 Russian Monyura 2015-06-06 20:02:06 248
ru8 Russian Monyura 2015-06-06 19:59:43 8
ru7 Russian Monyura 2015-06-06 19:59:10 6
ru6 Russian Monyura 2015-06-06 19:58:48 14
ru5 Russian Monyura 2015-06-06 19:58:08 52
ru4 Russian Monyura 2015-06-06 19:57:47 324
ru3 Russian Monyura 2015-06-06 19:55:39 306
en1 English Monyura 2015-06-06 19:50:58 8489 Initial revision for English translation
ru2 Russian Monyura 2015-06-06 19:47:28 84
ru1 Russian Monyura 2015-06-06 19:45:25 8862 Первая редакция (сохранено в черновиках)