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

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

Только что закончился ГП Балтики. Как решать нормально задачи A, B и F? А то мы давно столько всякой фигни не пихали, как сегодня.

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

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

Смотря что считать нормально по В. У нас поток со шафлом ребер если не куда надо все пришло

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

    Забавно, у нас то же самое, только у вас +, а у нас +16 :)

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

      Сид 239 рулит :)

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

      А вы какое d выбрали?

      У нас все тесты в квадратике 3 * 3 проходят максимум за 0.930 c

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

        У нас тоже d = 3, работает за 1.6 с сидом 42424243.

        UPD, ой я неправильно тебя прочитал. На всех тестах мы не запускали, тестировали только на сервере.

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

У кого-нибудь получилось запихать отжиг в F?

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

    У нас быстро зашел перебор с отсечением по ответу и предварительной сортировкой массива.

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

В F у pashka довольно простое решение — динамика по подмаске, которая минимизирует число стопок, а при равенстве — сколько в последней стопке

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

    Да, мы уже поняли, действительно очень просто. Мы что-то затупили и запихали что в этой задаче, что в A, решение за 3n с кучей разных хаков.

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

    Can you give me the code of the solution?

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

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

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

F: Dynamic programming d[mask] = (minimal number of subsets one can split mask into, minimal sum in the last subset).
A: Define convolution conv(d)[mask] = sum {d[x] | x is submask of mask}. One can calculate conv and conv^-1 in O(n2^n). Let clique[mask] = 1 if mask is clique, 0 otherwise. One need to check conv^-1(conv(clique)^a * conv(antilclique)^b)[full mask] != 0 -- then one can split graph in no more than a cliques and b anticliques. This can be done in O(n2^n) overall.

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

    Can you explain in detail, why "conv^-1(conv(clique)^a * conv(antilclique)^b)[full mask] != 0"?

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

      "conv^-1(conv(clique)^a * conv(antilclique)^b)[full mask]" is a number of ways to choose (not necessarily distinct, possible intersecting) a cliques and b anticliques covering entire graph (i.e. all vertices).

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

    For the fixed a and b, I can calculate conv^-1(conv(clique)^a * conv(antilclique)^b) in O(n2^n) easily. But how to make it O(n2^n) overall?

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

      You can use two properties of the problem to speed it up: 1. in a row (or a column) ones will form an interval 2. you only need last element of conv^-1(...), not the entire result

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

      Minor addition to ikatanic answer: last element (in fact, any single element) of conv and conv^-1 can be calculated in O(2^n).

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

    Could you please give some more details or your code for F.

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

Как адекватно решать I? Глупое решение вроде как экспоненциально работает. У меня была лишь идея, что для подпрограммы запустим X рандомных входных стэков и посмотрим как на них воздействует подпрограмма (на какой глубине произойдет последнее изменение, маска как на этот элемент повлияют верхние, константа и какие сверху еще добавятся). Такую ересь не успели написать. Подозреваю, что есть решения намного проще

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

    Подпрограмма сводится к листу булов (снимаем последний элемент со стека и добавляем или вычитаем из предпоследнего), delta (добавляется к последнему после выполнения листа булов) и листу интов (кладутся на стек)

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

    I solved I using matrix multiplication. I took a 11x11 matrix (10 stack variables and 1 constant). Then, putting a digit on stack, +, — every thing can be represented as a 11x11 matrix.

    Also each of the sub-routine is a matrix.

    It made my solution simpler.

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

    Давай для каждой каждой подпрограммы посчитаем, как она повлияет на стек. В общем случае, каждая подпрограмма берёт стек величины k и возвращает стек величины l, в котором элементы являются какими-то линейными комбинациями элементов исходного стека, возможно с некоторыми прибавленными константами. Будем для каждого k прямо хранить коэффициенты всех этих линейных комбинаций; тогда последовательное применение двух подпрограмм выражается в таком же виде с помощью чего-то сродни перемножению матриц (на самом деле, можно явно выписать матрицы, которые перемножаются).

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

    Сделаем ветор-столбец, в котором будем хранить 6 вариантов стека для каждого размера (от 0 до 5), размер текущего стека и единичку (пригодится потом). Тогда операции можно выразить в матричном виде: при запихивании матрица будет из стека размера (i — 1) перекидывать элементы в размер (i), а последний элемент получить умножением нашей единички на добавляемый элемент, а ещё прибавляем единицу к размеру. Операции сложения и вычитания делаются аналогично. Тогда каждая программа будет матрицей и можно применять ее за 17^3. Итого асимптотика O(|s|*17^3).

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

    Есть альтернативное решение. Обозначим за d числа на стэке, s – знаки.

    Тогда d1 d2 s заменяется на d3 = (d1 s d2).

    d1 s1 d2 s2 заменяются на d3 s3, которые легко считаются для разных s1 s2.

    Будем просто раскрывать программу и делать замены. Если в какой-то момент длина стала больше > 20 (хватает с запасом), то говорим, что эта программа невалидная и все, кто ее используют тоже невалидные и больше их не анализируем.

    В результате итоговая программа будет содержать просто d1 .. dn

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

    Наивное решение делается в два этапа. На первом этапе вычисляем простой текст всех подпрограмм во всех контекстах и просто сохраняем как строки. На втором этапе выполняем простой текст полученной программы. Действительно, это решение построит экспоненциально длинный простой текст для программы вида [9+]a[aaaa]a[aaaa]a...[aaaa]a9a. При длине строки до 160 ответ ещё помещается в int64, но такое решение не выполняет ограничения по времени и памяти.

    Для быстрого решения заметим, что все операции со стеком можно представить в виде матриц 6 × 6:

       (t0)     (a00 a01 a02 a03 a04 a05)     (s0)
       (t1)     (a10 a11 a12 a13 a14 a15)     (s1)
       (t2)  =  (a20 a21 a22 a23 a24 a25)  *  (s2)
       (t3)     (a30 a31 a32 a33 a34 a35)     (s3)
       (t4)     (a40 a41 a42 a43 a44 a45)     (s4)
       ( 1)     ( 0   0   0   0   0   1 )     ( 1)
    

    Здесь (s0, s1, s2, s3, s4) — исходный стек, начиная с верха, (t0, t1, t2, t3, t4) — результирующий стек, начиная с верха, а шестая строка служит для прибавления и вычитания константы. Примеры:

             (0 0 0 0 0 9)              (1 1 0 0 0 0)
             (1 0 0 0 0 0)              (0 0 1 0 0 0)
       9  =  (0 1 0 0 0 0)        +  =  (0 0 0 1 0 0)
             (0 0 1 0 0 0)              (0 0 0 0 1 0)
             (0 0 0 1 0 0)              (0 0 0 0 0 0)
             (0 0 0 0 0 1)              (0 0 0 0 0 1)
    

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

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

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

What is the 5th sample for problem I, I try hard on problem I for the last half of contest, but only get WA on test #5. thanks.

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

    It's [1]b[b[2]bb]ccc. The resulting stack is (from top) 2 1 2 1. Here, the subprogram is c = "12", as per the rules in the statement.

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

Как решать H?

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

    при помощи теоремы Виета расписать и получить, что

    (x1-1)*(x2-1) = n + 1
    

    где x1,x2 — корни. После этого нужно найти все делители числа n + 1 (и отрицательные тоже) и взять их как x1-1, восстановить коэффициенты p,q и положить их в сет. И не забыть, что для -1 ответ infinity

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

      Ну збс, опять задача на одноразовую теорему, о которой в курсе только задроты-математики.

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

        Я бы рад поддержать, так как математику сам не знаю, но уж теорему Виета не знать, вы серьезно? :D

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

        Еще задроты-математики иногда знают формулу решения квадратного уравнения, которое в данном случае будет целым тогда и только тогда, когда дискриминант (что-то около

        (p + 2)2 - 4(A + 1)

        , не помню точно) есть полный квадрат. Дальше дело техники: раскрываем разность квадратов и смотрим делители оставшейся части.

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

        Школьнику Васе из шестого "Б" сейчас очень обидно :(

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

По A выдумали такое, чтобы считать для каждой маски минимальное покрытие кликами:

Если клики размера три не существует, то нужно покрыть маску только лишь ребрами — такое можно посчитать динамикой по маскам, откусывая младший взведенный и любой другой биты, между которыми существует ребро за O(n2n).

В случае существования клики размера 3 (зафиксируем любые из таких трех вершин) посчитаем сначала динамику на остальных 17 вершинах за 317 с помощью перебора подмасок, выбирая те, что являются кликами. Очевидно, для масок, не содержащих наши 3 вершины, все посчитано верно. А для любой маски, в которой какие то из наших трех вершин содержатся, мощность минимального покрытия либо равна ответу для той же маски без зафиксированных вершин, либо превышает его ровно на 1.

Чтобы проверить, что из этого правда, просто расширим динамику на 17 вершинах, храня дополнительно всевозможные подмножества из 3-х остальных вершин, которые можно покрыть кликами при сохранении минимальности ответа (например, в 23-битовом числе). Теперь для любой маски достаточно посмотреть на расширенную динамику для той же маски, но без 3-х фиксированных вершин, и посмотрев на возможность покрытия нужных вершин, сделать ответ либо равным, либо на единицу большим ответа, посчитанного в динамике.

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

Can some1 describe a solution for C in details more or less?

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

Is it possible to see solutions or editorial of this contest ?

If yes, please share link.

I want to see solution of 'F'. problem link is here. Thanks in advance