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

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

На этой неделе (26-30.03.2018) проходит республиканская олимпиада в г. Минске. Как обычно будет два тура, на которых будет предположительно по 4 задачи. К сожалению задачи будут, наверное, сильно сложными для меня, поэтому предлагаю обсудить решения в комментариях к этому посту. А можно обсудить не только задачи :)

Желаю удачи всем участвующим школьникам!  

Первый тур

Задача 1. Галактика

Условие

Текст условия

Решение

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

Решим задачу для координаты X.

Пусть мы выбрали x, тогда ответ будет равен: . Предподсчитав и , можно за O(1) перебрать все координаты.

Сложность по времени: O(N + M), по памяти: O(1).

Бонус: попробуйте решить задачу для M ≤ 109 за . К сожалению придется использовать __int128, но самое интересное — это идея, а не детали реализации.

Задача 2. Поиск в перестановке

Условие

Ссылка by gepardo.

Решение

Можно получить легкие баллы воспользовавшись std::nth_element(). К сожалению, у данного алгоритма константа количества сравнений точно больше , поэтому полные баллы не удастся получить, но 90 баллов — запросто.

Задача 3. Спортивная трасса

Условие

Текст условия

Решение

{{ Решение задачи }}

Задача 4. Дерево удачи

Условие

Ссылка by gepardo.

Решение

{{ Решение задачи }}

Второй тур

Задача 1. Несложная задача

Условие

Ссылка by gepardo.

Решение

{{ Решение задачи }}

Задача 2. Город художников

Условие

Ссылка by gepardo.

Решение

{{ Решение задачи }}

Задача 3. Реорганизация

Условие

Ссылка by gepardo.

Решение

{{ Решение задачи }}

Задача 4. Лабиринт

Условие

Ссылка by gepardo.

Решение

{{ Решение задачи }}

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

»
6 лет назад, # |
  Проголосовать: нравится +16 Проголосовать: не нравится

КУ

»
6 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

скоро ли появятся условия ?

»
6 лет назад, # |
Rev. 2   Проголосовать: нравится +21 Проголосовать: не нравится

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

»
6 лет назад, # |
Rev. 4   Проголосовать: нравится +36 Проголосовать: не нравится

1_2(100): За (n-1) запросов к библиотеке можно построить дерево отрезков, в каждой вершине которого будем хранить позицию минимального элемента в массиве на этом отрезке. Далее (k-1) раз за (log n) запросов удаляем минимум. Позиция k-ого минимума как раз и будет ответом. Итого запросов к библиотеке n-1+(k-1) log n.

  • »
    »
    6 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится -10 Проголосовать: не нравится

    Пробовал кто-то это реализовать? Выглядит как O(2·N) операций сравнения, что плохо наверное.

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

    • »
      »
      »
      6 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

      Я на туре написал на 100. Мы же вызываем IsLess только при объединении двух сыновей, поэтому при построении мы делаем ровно (n-1) запросов к библиотеке.