Блог пользователя AGrigorii

Автор AGrigorii, история, 7 лет назад, По-русски

982A - Row

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

982B - Bus of Characters

Заметим, что финальные пары интроверт-экстраверт определяются однозначно, а также, что с помощью стека, можно восстановить, какой экстраверт к какому интроверту подсядет (заметим, что нолики единички будут образовывать правильную скобочную последовательность). Тогда одним из решений может быть такое:

  1. Сортируем массив длин рядов по возрастанию
  2. Для каждого интроверта пишем номер очередного свободна ряда и добавляем его в стек
  3. Для каждого экстраверта пишем последнее число из стека и удаляем его оттуда

982C - Cut 'em all!

Заметим, что если есть какое-то ребро, которое можно удалить, то мы можем сделать это, без каких-либо последствий. Рассмотрим такое ребро, что в одном из полученных поддеревьев уже точно нельзя удалить больше, а его удаление возможно. Что произойдет, если мы его оставим в дереве? Относительно другого конца ребра четность поддерева не изменилась, что означает, что на дальнейшие удаления это ребро не повлияло. А значит, если мы его удалим, то ответ улучшится.

Отсюда следует жадное решение: в дфс-е насчитываем для каждой вершины размер поддерева, включая текущую вершину, и если он четен, то ребро в потомка (если он существует), можно удалить.

982D - Shark

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

982E - Billiard

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

  1. Если вектор направлен под углом в 90 градусов к осям, то пишем if-ы.
  2. Иначе поворачиваем поле таким образом, чтобы вектор удара стал (1, 1).
  3. Выписываем уравнение прямой движения шара:  – 1·x + 1·y + С = 0. Если подставим изначальное положение шара, то найдем коэффициент C.
  4. Заметим, что в бессконечно замощенной плоскости координаты любой лузы представимы в виде (k1·n, k2·m).
  5. Подставим координаты лузы в уравнение прямой шара. Получается диофантово уравнение A·k1 + B·k2 = C. Оно разрешимо в случае, если C | gcd(A, B). В противном случае решений нет.
  6. Из всех решений данного диофантово уравнения нас интересует наименьшее на положительной полуоси.
  7. По найденным k1, k2 легко получить координаты соответствующей им лузе
  8. Повернуть поле обратно, если требуется.

982F - The Meeting Place Cannot Be Changed

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

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

Рассмотрим только циклы, которые выходят из вершины главного цикла, приходят в какую-то вершину главного цикла, а дальше движутся по главному циклу и замыкаются. Если цикл выходит из главного цикла, то он должен на него вернуться где-то дальше по направлению главного цикла, при этом не перескакивая отмеченные вершины с ответом (иначе будет пустое пересечение, а мы предположили, что не пустое) (считаем, что если цикл вернулся не по главному циклу туда же, откуда вышел, то он совершил скачок длинной весь главный цикл, а не 0). От вершины, в которой рассматриваемый цикл возвращается на главный, до вершины, из которой он выходит с главного, проведём дугу в направлении главного цикла. Те вершины главного цикла, которые такая дуга не покрывает, заведомо не могут являться ответом. Пересечение всех рассмотренных циклов с главным определяется пересечением всех таких дуг.

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

Теперь нужно отметить все дуги между возвратом-выходом с главного цикла. Для этого будем запускать dfs из всех вершин главного цикла и пытаться вернуться на главный цикл как можно дальше (расстояние измеряется по количеству вершин главного цикла между выходом и возвратом). Как было отмечено выше, циклы, выходя и возвращаясь, не могут перескакивать ответ. Значит все dfs'ы, стартующие между границами ответов, стремятся к какой-то вершине главного цикла, которая является граничной в дуге с возможными ответами. Значит если в одном dfs'е мы выбрали самую удалённую вершину из нескольких вариантов, то в другом dfs'е рассматриваемые варианты не поменяются ролями, и старая самая удалённая вершина так и останется самой удалённой среди тех же вариантов в новом dfs'е. Значит можно запускать все dfs'ы с общим массивом used, в котором кэшировать самую удалённую вершину.

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

Полный текст и комментарии »

Разбор задач Codeforces Round 484 (Div. 2)
  • Проголосовать: нравится
  • +24
  • Проголосовать: не нравится

Автор AGrigorii, 7 лет назад, По-русски

Привет, Codeforces!

В 17.05.2018 19:35 (Московское время) состоится очередной раунд Codeforces #484 для участников из второго дивизиона. Традиционно, участники из первого дивизиона приглашаются поучаствовать в соревновании вне конкурса. Как обычно, обратите внимание на необычное время начала раунда.

В этот раз задачи для вас готовили я и Андрей API Пикас.

Хотелось бы поблагодарить Николая KAN Калинина за помощь в подготовке задач и координацию раунда, Михаила MikeMirzayanov Мирзаянова за замечательные системы Codeforces и Polygon, а также Кирилла kittylover Самелюка, Николая Apollon76 Пермякова, Дмитрия Krainov_Dmitry Крайнова, Андрея GreenGrape Райского и Алексея Um_nik Данилюка за прорешивание задач и ценные советы.

Участникам будет предложено шесть задач и два часа на их решение. Разбалловка будет объявлена позднее.

Желаем участникам найти интересные задачи, успешных попыток, взломов и высокого рейтинга!

До встречи!

UPD Разбалловка 500-1000-1500-2000-2500-3000

UPD2 Поздравляем победителей из второго дивизиона:

  1. Kotori_Is_My_Wife

  2. vosptu

  3. ez_zkj

  4. relativity

  5. iordache.bogdan

А также победителей двух дивизионов:

  1. Claris

  2. Benq

  3. Kotori_Is_My_Wife

  4. kmjp

  5. vosptu

UPD3 Разбор будет опубликован завтра.

UPD4 Разбор

Полный текст и комментарии »

  • Проголосовать: нравится
  • +181
  • Проголосовать: не нравится

Автор AGrigorii, история, 7 лет назад, По-русски

Добрый день, кодфорсес!

Возник такой вопрос: проводил ли кто-нибудь какое-нибудь соревнование в доменной группе, морозя монитор? Если да, то как вы его размораживали, возможно остались какие-нибудь утилитки или что-нибудь такое? Буду признателен любому комментарию по теме. Всем добра (:

Полный текст и комментарии »

  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

Автор AGrigorii, история, 8 лет назад, По-русски

Всем привет! Столкнулся с такой проблемой: а как сжать граф c n ≤ 104, m ≤ 105 (n вершин, m ребер). Т.е. ищем цикл, сжимаем его в одну вершину, и ребра, которые шли в какую-то вершину цикла, перекидываем в нее. Подскажите, пожалуйста, как это сделать оптимально? Как хранить граф, как сливать цикл? Спасибо!

Полный текст и комментарии »

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

Автор AGrigorii, история, 8 лет назад, По-русски

Привет всем! Сегодня привезли футболку, но к своему стыду я не знаю, что на ней изображено.. Что это? :с

Полный текст и комментарии »

  • Проголосовать: нравится
  • +18
  • Проголосовать: не нравится

Автор AGrigorii, 8 лет назад, По-русски

676A - Николай и перестановка

Все, что нужно сделать в этой задаче — найти индексы в массиве чисел 1 и n. Пусть это будут p1 и pn соответственно, тогда ответом на задачу будет максимум из следующих значений:

abs(n - p1),  abs(n - pn),  abs(1 - p1),  abs(1 - pn).

Асимптотика решения O(n).

676B - Пирамида из бокалов

Ограничения в задаче были таковы, что можно было просто промоделировать процесс. Предлагаем вам следующий вариант: заведем емкость бокала равную 2n единиц. Утверждается, что тогда излишки шампанского, которое польется на уровень ниже, будут всегда соответствовать целому числу. Итого, выльем в самый верхний бокал t * 2n единиц объема, а далее действуем следующим образом: если в текущем бокале больше шампанского, чем его емкость, то surplus = Vtek - 2n, а еще нужно не забыть добавить surplus / 2 шампанского в два бокала на уровне ниже.

Асимптотика решения: O(n2).

676C - Вася и строка

Эта задача хорошо решается методом двух указателей. Пусть указатель на левую границу l, а на правую r. Тогда для каждой позиции l будем двигать правую границу до тех пор, пока на подстроке slsl + 1... sr можно провести не более k операций замены, чтоб эта подстрока была симпатичной. Для проверки потребуется завести частотный словарь размером с алфавит строки, который будем пересчитывать вместе со сдвигом границ.

Асимптотика решения: O(n * alphabet).

676D - Тесей и лабиринт

Можно легко понять, что состояний лабиринта всего 4. Допустим, в этой задаче нет никакой кнопки, как ее решать? Ответ очевиден: это обычный поиск в ширину на гриде. Что нам дает наличие кнопки? Нам нужно дополнить наш граф еще 3 дополнительными уровнями, а нажатие на кнопку сассоциировать с переходом на следующий "уровень" лабиринта. Вертикальные переходы необходимо зациклить. Тогда запустим бфс уже на таком трехмерном гриде и выберем минимум из значений по уровням в клетке с Минотавром, либо поймем, что пути до этой клетки нет.

Асимптотика решения: O(n * m).

676E - Последняя битва человека против ИИ

Пожалуй, самая интересная задача этого раунда. Необходимо разобрать два случая: k = 0,  k ≠ 0.

  1. Случай k = 0. Тогда делимость многочлена на x - k будет определяться лишь значением коэффициента a0. Если a0 уже известен, то нужно сравнить его с нулем. Если a0 = 0, то это уже победа человека, иначе поражение. Если же a0 еще не известен, то все зависит от того, чей сейчас ход. Кто ходит — тот и выигрывает, поставив на позицию a0 нужное ему значение.

  2. Случай k ≠ 0. Тогда опять же есть два случая: все коэффициенты уже известны, и нам нужно проверить, является ли x = k корнем получившегося многочлена (например схема Горнера), или есть неизвестные коэффициенты. Если есть неизвестные коэффициенты, то поймем почему выигрывает при оптимальной игре тот, кого последний ход. Допустим известные все коэффициенты, кроме одного. Пусть при xi. Тогда обозначим за C1 сумму по всем j ≠ i ajkj, а за C2 = ki ≠ 0. Тогда уравнение ai * C2 =  - C1 относительно ai всегда имеет решение. Если ходит человек, то в качестве коэффициента ему нужно вписать корень, а если ходит компьютер — что угодно, лишь бы не корень.

Асимптотика решения O(n).

Полный текст и комментарии »

  • Проголосовать: нравится
  • +63
  • Проголосовать: не нравится

Автор AGrigorii, история, 9 лет назад, По-русски

Thanks to all! It was cool and so interesting!

Полный текст и комментарии »

  • Проголосовать: нравится
  • +21
  • Проголосовать: не нравится

Автор AGrigorii, история, 9 лет назад, По-русски

Привет всем! Кто подскажет, в какой момент времени после раунда посылки проверяются антиплагиатом: до или после выставления рейтинга?

Полный текст и комментарии »

  • Проголосовать: нравится
  • +11
  • Проголосовать: не нравится

Автор AGrigorii, история, 9 лет назад, По-русски

Привет всем! Обнаружил, что если нерешенную задачу с контеста добавить в мэшап. Решив ее, отправить решение и в мэшап, и в раунд, откуда взял, то в архиве добавится +2 к общему кол-ву решенных задач. Думается, что так не должно быть..

Полный текст и комментарии »

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

Автор AGrigorii, история, 9 лет назад, По-русски

Привет всем! Давным-давно слышал, что есть сортировка, которая не меняет элементы в массиве местами, а лишь получает перестановку индексов этого массива. Был бы рад узнать поподробнее.. Спасибо!

Полный текст и комментарии »

  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

Автор AGrigorii, 10 лет назад, По-русски

Решая задачу B Отборочного контеста СГАУ на четвертьфинал ACM ICPC 2014-2015 столкнулся с маленькой такой проблемкой: Решение "зависло" на 1 тесте.. Буду весьма признателен, если кто растолкует что с чем!

ссылка на код тут

Полный текст и комментарии »

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

Автор AGrigorii, 10 лет назад, По-русски

Ребят подкиньте задач на комбинаторику, желательно не очень сложных.. А лучше простых или чуточку сложней простого. Буду признателен!

Полный текст и комментарии »

  • Проголосовать: нравится
  • -2
  • Проголосовать: не нравится