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

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

Давайте обсуждать задачи здесь.
Корректный ли был тест номер 6 в задаче G?
ADD: И как решать B?
ADD: ссылка на условия

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

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

Как решать I?

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

    Сначала вычтем из каждой score по n - 1, теперь победа стоит 1, ничья 0, поражение -1. И построим такую сеть между вершинами(игроками). Пропускная способность между вершинами i и j: c[i][j] = 1, тогда когда score[i] > score[j] и добавим исток и сток. От истока будут идти ребра во всех игроков i с положительным score[i] и пропускной способностью score[i] и от каждой вершины i с отрицательным score[i] в сток с пропускной способностью  - score[i]. Теперь найдем макс поток и проверим является ли он суммой положительных score и если все ок выведем потоки между игроками

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

по поводу задачи В: найдем для каждого центра палиндрома макс. длину палиндрома. Теперь возьмем для каждого центра половину макс. палиндрома и отсортируем все эти подстроки (с началом в центрах) лексикографически с помощью хешей. Теперь для каждых двух соседних осталось посчитать lcp — тоже хешами. Получается аналогия с суффиксным массивом и задачей "Найти количество различных подстрок в строке" и решение за O(nlog2(n)). При таких ограничениях должно зайти.

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

    Кажется в этом случае нужно быть аккуратными с четностью палиндромов и пустыми строками.

    Решение за O(N (1 + set)):

    Найдем для каждой позиции максимальный палиндром, заканчивающийся в ней. Очевидно, что все остальные палиндромы, заканчивающиеся здесь уже рассмотрены для одной из предыдущих букв. Сделать это можно небольшой модификацией этого алгоритма. — записать момент, когда r = текущий символ.

    Далее скидали хеши в сет. Посмотрели размер сета.

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

      Кажется в этом случае нужно быть аккуратными с четностью палиндромов и пустыми строками.

      действительно, можно решать отдельно для четных и нечетных палиндромов

      UPD ага, удивительно похоже на задачу с ПТЗ))

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

    А можно код посмотреть? А то во время тура валилось на 18 тесте.

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

Корректный ли был тест номер 6 в задаче G?

Вполне. 47, ответ равен 8 (числа 1 1 1 1 1 3 10 704).

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

    Почему это правильный ответ?

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

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

      Перебор будем делать следующим образом. Введем определение "характеристика последовательности" — произведение вида . Очевидно, что при росте ai характеристика будет уменьшаться и что характеристика всей последовательности, являющейся ответом, равна n. Зафиксируем элемент последовательности (назовем его текущим). Если характеристика последовательности от начала до текущего (не включая его) больше n, то дальше перебирать смысла не имеет (потому что дальше она будет только расти). Иначе же делаем следующее:

      1. Установим все элементы последовательности после текущего равным ему (именно это и обеспечивает генерацию неубывающих последовательностей).
      2. Посчитаем характеристику всей последовательности.
      3. Если она меньше n — перебирать нет смысла, потому что при переборе будут увеличиваться элементы, уменьшая характеристику — выходим.
      4. Если она больше n — рекурсивно вызываем перебор, сделав следующий элемент текущим.
      5. Если пришли сюда из п.4 и последовательность еще не сгенерирована — увеличиваем текущий элемент на 1 и goto 1.

      Ну и, понятно, что как только мы получили последовательность нужной характеристики и нужной длины — выходим. Для оптимизации, если текущий элемент — последний, его можно не перебирать, а получить сразу следующим образом: положим l = Пi = 1k - 1(ai + 1), r = Пi = 1k - 1ai. Тогда если нужное нам последнее число равно x, то l(x + 1) = n * r * x, откуда x легко находится или определяется, что он не существует.

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

    В этом случае можно огласить идею решения и сообственно доказательство ответа (почему не 7 к примеру)?

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

Как в H Cnk обойти?

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

    Не нужно его обходить — можно просто их посчитать в лоб через факториалы. Считать-то их не больше 10 раз придется.

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

      Мы же считаем по модулю 109 + 7. Как учитывать это при делении на k!?

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +2 Проголосовать: не нравится
      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +8 Проголосовать: не нравится

        По-моему, можно ещё проще сделать. Посчитать обратный элемент для числа k! по модулю 109 + 7. Для этого нужно, с помощью бинарного возведения в степень, возвести k! в степень 109 + 7 - 2 (это следует из малой теоремы Ферма).

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

          Собственно говоря, если перейти по ссылке, то там это написано.

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

А как решать F? И почему для теста 1 2 3 ответ 0? Вроде ведь можно представить так

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

    if (a != c) puts("0"); else cout << 2 * a * (b + c)

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

    Challenge successed. Для условия :) Согласен, оно написано коряво и ваш пример ему соответствует. Разумеется, также имелось ввиду, что все точки должны лежать на горизонтальной прямой по одну сторону от A.

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

      Обозначать многоугольник принято по порядку обхода вершин. Поэтому условию задачи, в котром говорится о прямоугольнике ABCD, не соответствует ни чертёж к приимеру из условия (ABDC), ни приведённый контпример (ACBD).

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

    У вас тут получился прямоугольник ACDB или ADCB, а там написано что прямоугольник должен быть ABCD. То-есть у вас тут точка B противоположна точке A, а они должны быть соседними.

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

      Замечу, что в примере к задаче прямоугольник тоже ACDB.

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

Как делать А. Моя динамика упирается в ML(((

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

    Использовать только две строчки.

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

    Написал динамику получил ML, поставил заместо таблицы map получил TL, убрал map поставил хэш-таблицу получил AC.

    Хотя подозреваю что есть решение гораздо проще:)

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

      Есть.

      Формула где-то ниже, а вот ее док-во: Пусть в каком-то представлении числа n есть хотя бы одна единица (g^0). Тогда этому представлению можно однозначно поставить в соответствие представление для n-1 без этой единицы. Собственно, из любого представления для n-1 можно получить представление для n, просто добавив туда единицу. Очевидно, что все полученные представления различны и для любого представления n с хотя бы одной единицей есть прообраз — представление для n-1. Таким образом, кол-во представлений для n, в которых есть хотя бы одна единица — А(n-1).

      Пусть есть представления без единиц. Тогда

      1. n mod g=0
      2. Их кол-во равно A(n div g) (т.к. легко построить взаимнооднозначное соответствие).

      Итого if (n mod g=0) then A(n)=A(n-1)+A(n div g) else A(n)=A(n-1).

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

    Можно было заметить красивую формулу: