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

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

Блэкджек (задача A, 2-ой дивизион). Автор задачи - Alex_KPR

 

 

Очевидно, что масти никакой роли не играют. Рассмотрим теперь подробно все случаи:

[0 - 10] — ноль способов.
[11] — четыре способа, используя тузы.
[12 - 19] — четыре способа, используя карты от 2 до 9.
[20] — 15 способов, они описаны в примечании условия задачи.
[21] — четыре способа, используя тузы.
[22 - 25] — ноль способов.

 

 

Сложность алгоритма — O(1).

 

 

Проверка штанов на унылость (задача B, 2-ой дивизион; задача A, 1-ый дивизион). Автор задачи - Alex_KPR

 

 

Заметим, что мы не можем добраться до i + 1-го вопроса до тех пор, пока не кликнем на все ответы на i-м вопросе. Из всех ответов на i-ом вопросе нас вернут в начало ai - 1, и только один отправит дальше. Каждый неверный ответ заставит проделать нас путь длины i - 1 плюс единицу за клик по неверному ответу. Отсюда формула для перехода на i + 1-ый шаг:

ci = (ai - 1)· i + 1 (нумерация с единицы).

Просуммируем все значения ci для получения ответа на задачу.

 

 

Сложность алгоритма — O(n).

 

 

 

 

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

а) Ктулху — это связный граф
б) Ктулху — это граф с единственным циклом

Если к дереву из трёх и более вершин добавить ровно одно любое ребро (не мультиребро и не петлю), то мы получим граф, обладающий свойствами а) и б). Отсюда простое решение: проверим граф на связность (это можно сделать одним поиском в глубину) и проверим условие n = m. При выполнении обоих условий граф является Ктулху.

 

Сложность алгоритма — O(m).

 

 

Русская рулетка (задача D, 2-ой дивизион; задача C, 1-ый дивизион). Автор задачи - Alex_KPR

 

 

Разберёмся с задачей сперва в случае чётного n. Очевидно, что при k = 1 ставить патрон нужно в крайнюю правую позицию, то есть, например, при n = 8 ответ будет выглядеть так:

.......X

Оценим вероятность застрелиться в этой ситуации. Напишем нули у тех слотов барабана, которые приведут нас к поражению, а у победных напишем единицы:

10101010

Отсюда понятно, что каждый следующий патрон нужно ставить так, чтобы не снижать вероятность собственной победы до тех пор, пока это возможно. Когда все слоты, ведущие к поражению, будут заполнены патронами, останется только получать лексикографически наименьший ответ с ростом k. Рассмотрим ответы для всех остальных k при n = 8:

.....X.X
...X.X.X
.X.X.X.X
.X.X.XXX
.X.XXXXX
.XXXXXXX
XXXXXXXX

В случае нечётного n рассуждения будут немного иными в начале, давайте построим ответ для n = 9 и k = 1:

........X
010101010

Можно поставить патрон аналогично чётному случаю, как описано выше. А можно поступить иначе — зарядить первый слот и сдвинуть барабан влево, смотрим:

X.......X => .......XX
010101010    101010100

Очевидно, что вероятность не изменилась, а ответ улучшился. Дальше придётся заряжать револьвер так, как описано для чётного случая:

.....X.XX
...X.X.XX
.X.X.X.XX
.X.X.XXXX
.X.XXXXXX
.XXXXXXXX
XXXXXXXXX

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

 

Сложность алгоритма — O(p).

 

 

Время грабить корованы (задача E, 2-ой дивизион; задача D, 1-ый дивизион). Автор задачи - Alex_KPR

 

 

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

1. Для каждого (a, b)-запроса пробежим по массиву и вычислим результат тупо в лоб, то есть:

for(int i = a; i < n; i += b)
  ans += a[i];

2. Для фиксированного b посчитаем за линию динамику, чтобы научиться отвечать на запросы для произвольного a за O(1):

for(int i = n - 1; i >= 0; i--)
  if (i + b >= n)
    d[i] = a[i];
  else
    d[i] = d[i + b] + a[i];

Очевидно, что 1-ый алгоритм будет неэффективен при малых значениях b, а 2-ой — при очень разных b. Заметим, что не бывает такого теста, при котором все b достаточно малы и притом различны. Отсюда простая идея: будем решать задачу 1-ым алгоритмом при больших значениях b (больше некоторого c) и 2-ым при малых (меньше и равном c).

Сортировка вначале нужна для того, чтобы не пересчитывать динамику для фиксированного b.

Можно доказать, что при выборе c равном будет достигнута оценка .

 

Сложность алгоритма — .

 

 

Закупка множеств (задача E, 1-ой дивизион). Автор задачи - winger

 

 

Разбор задачи провёл winger.

Построим двудольный граф G1 с множествами в левой доле и числами в правой доле. Ребро из множества в число проведем, если число принадлежит множеству. По теореме Холла, из условия "известно, что объединение любых k множеств содержит не менее k различных чисел (для любого целого положительного k)" и из того, что различных чисел не больше n, вытекает существование полного паросочетания, (включающего все вершины).

Найдем в G1 какое-нибудь такое паросочетание M = {(ui, vi)}. Теперь построим ориентированный граф G2 с вершинами, соответствующими множествам и ребрами (ui → uj) для всех ребер (ui, vj) в G1 не из M. Любой искомый набор множеств размера k не должен содержать в G2 ребер из набора наружу (иначе в нем будет находиться k чисел из паросочетания + количество вершин не из набора в которые есть ребра из набора).

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

Напишем на ребрах G2 бесконечные веса, добавим вершины s и t, и для каждого множества ui с весом w нарисуем ребро ui → t с весом w если w > 0 или ребро s → ui с весом  - w если w < 0. Доля, содержащая s в минимальном разрезе получившегося графа из s в t, будет соответствовать искомому оптимальному набору.

 

Асимптотическая сложность решения — O(n3).

 

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

13 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
У меня вопрос по поводу задачи: "в ориентировам графе с весами на вершинах найти набор вершин минимального суммарного веса без ребер наружу".

В случае когда все веса вершин одного знака, мы никогда не получим потока, потому что будет изолирован или сток или исток, но сама задача может иметь решение. 
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А в чем проблема? Если все вершины имеют положительный вес, то нам, очевидно, выгодно выбрать пустое множество, что и будет сделано, так как исток изолирован. Если все вершины имеют отрицательный вес, то нам выгодно выбрать их всех, что так же будет сделано в этом случае, так как все вершины будут лежать в одном множестве с s. 
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Допустим изначально ми емеем цикл. Ответ на задачу "в ориентировам графе с весами на вершинах найти набор вершин минимального суммарного веса без ребер наружу" будет сумма вессов всех вершын независимо от того, какого знака весса. Но если брать все величины  положительними, то как ми увидели, ответом будет 0, так как брать ничего вигоднее всего. Или что-то я пропускаю...
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Все правильно, ответом будет 0, т.е. выгоднее взять пустое множество. Условие этого не запрещает.
        • 13 лет назад, # ^ |
            Проголосовать: нравится +2 Проголосовать: не нравится
          Да, я немножко о другой задаче подумал. Я думал, о такой задаче. В графе нужно взять как можно максимальний набор вершын, с которых не виходят ребра, и среди всех таких максимальных наборов выбрать тот, который имеет минимальний вес.

          Спасибо. :)
13 лет назад, # |
Rev. 3   Проголосовать: нравится +2 Проголосовать: не нравится

Не туда
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Какое большое спасибо я бы сказал автору разбора который дает ссылки на условия задач...
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    какое большое спасибо я сказал бы Егору, который написал бы мне это в личку ;)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Аудитория этой моей просьбы тобой не ограничивается ;)
13 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится
Buying Sets is really cool.
13 лет назад, # |
  Проголосовать: нравится +17 Проголосовать: не нравится
If codeforces want to face the world, why not just use the English only?
  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    I dont understand russian...Why dont u post it in english or atleast in both languages:(

13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
and what about the many who dont understand Russian. English is the standard language accepted all over the world.That's why I told that versions of both languages should be written.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    I've answered to "why not just use the English ONLY?", not to you.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      No..Its a serious thing ,,If questions are asked in both languages then why not give solutions as well in both languages
13 лет назад, # |
Rev. 2   Проголосовать: нравится +6 Проголосовать: не нравится

Wow I really like your editorial style (grey tables, complexity at the end of task's tutorial).
It would be great to:

1 - Make this style standard for every round (maybe automated: the author should only fill in a "form")
2 - Write complexity in this form: "Time: O(1) - Space: O(1)"

UPD: Another idea: wouldn't be fantastic if editorial pages are structured like a wiki? With the possibility to edit (most likely to translate) the text to all users? Maybe only to "trusted" users? (something like problem tags)
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
nice tutorial. Thanks :)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Does the last one will be translated too? :)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Nice tutorial.
»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone explain why the complexity for Time to Raid Cowavans (Div1-D) is O(P * sqrt(N))? I'm new to this complexity analysis stuff

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

    Because we use 1-st method only for queries where B >= sqrt(N), so each query runs in O(sqrt(N)) time. 2-nd method works O(n) time for initializing array d, and O(1) to answer each query. We don't need more than sqrt(N) initializations, because we use 2-nd method only for groups of queries where B < sqrt(N). Total complexity is O(sqrt(N) * p1 + sqrt(N) * N + p2) = O(sqrt(N) * max(N, P)). p1 — number of queries where B >= sqrt(N), and p2 == p - p1.

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

      Thanks for the detailed explanation!

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

      Exactly, so there is a mistake in the solution where they say the complexity is O(sqrt(n) * p). It's actually O(sqrt(n) * max(n, p).

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

Может ли кто-нибудь пояснить, почему вторая часть задачи E эквивалентна нахождению минимального разреза?