AlexSkidanov's blog

By AlexSkidanov, 14 years ago, In Russian

Условия: http://contests.snarknews.info/files/snws11/probs/day5.pdf 
Результаты: http://contests.snarknews.info/index.cgi?data=snws11/standing5&menu=index&head=index&mod=snws11&class=snws11 

Задача А.
Сначала заменим все числа на A%mod, так как понятно нас интересует только остаток, затем добавляем сначала все числа с одним остатком, затем с другим итд. Допустим, что сейчас добавляются числа с отстатком m, а до этого уже были добавлены какие-то числа с другими остатками. Поддерживаем динамику d от двух параметров, где d[v][q] = количество последовательностей из уже добавленных чисел таких, что есть ровно v пар чисел с одинаковым остатком, НЕ равным m, стоящих рядом, и q пар чисел с остатком, равным m, стоящих рядом.
Кроме того, двигаясь вправо поддерживаем: n - сколько уже вообще добавлено чисел, и r - сколько уже вообще добавлено чисел с текущим остатком. Теперь, закрепим v и q. У нас есть три опции:
1. Поставить число между двумя одинаковыми числами, не имеющими остаток m. Таких вариантов, очевидно, v, и такое действие уменьшит v
nd[v-1][q] += d[v][q] * v
2. Поставить число между или рядом с числом с остатком m. Это увеличит q. Таких вариантов, если подумать, 2*r-q:
nd[v][q+1] += d[v][q] * (r*2-q)
Наконец, поставить число в любую другую позицию. Это не изменит ни q ни v. Это все оставшиеся варианты, то есть n+1 - v - (r*2-q)
nd[v][q] += d[v][q] * ( n + 1 - v - (r*2-q) ).
Потом, когда остаток от деления меняется, добавляем числа с предыдущим остатком к старым:
nd[v+q][0] += d[v][q];
В конце ответ будет в d[0][0] - потому что не должно быть никаких чисел с равным остатком рядом.


Задача B.
Я занумеровал вершины в порядке выхода из DFS, и вывел их по убыванию этой величины.

Задача C.
Единственное ограничение, данное нам -- это то, что кратность ребер не превышает четырех. В частном слуачае, когда вес всех ребер равен единице, это будет задача на матричную теорему Кирхгофа, которая решается за N^3.
Я упускаю что-то очень важное :о)

Задача F.
Очевидно, сами числа не важны, важна только их длина. Нам надо понять, сколько битов понадобится, чтобы представить число с записью 10^K в системе счисления B. Это, если я правильно помню, равно floor( K*log(B)/log(2)+1 ).

  • Vote: I like it
  • +6
  • Vote: I do not like it

14 years ago, # |
  Vote: I like it 0 Vote: I do not like it
Задача B.
Я делал так: построил новый граф на тех же вершинах, в котором провел ребро B->A, в том случае, если А не выиграл у В и не существует С такого, что А выиграл у С и С выиграл у В. Иными словами я провел ребро в новом графе от В к А, если А не может стоять раньше В в искомом списке. Затем упорядочил вершины с помощью топологической сортировки.
  • 14 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it
    Дело в том, что С в итоговом списке должен стоять между A и B. Иначе подходит просто сортировка по очкам
    • 14 years ago, # ^ |
        Vote: I like it +4 Vote: I do not like it
      Очень похоже на то, что тесты были очень слабые. Во время контеста я не заметил необходимость того, чтобы C стояло между A и B, и просто вывел в порядке убывания полустепеней выхода (при таком условии легко показать, что это правильный ответ).

      А правильно решать, видимо, следовало как-то так:
      Пусть для n <= m мы строить ответ умеем. Положим n = m + 1.
      Выберем некоторую вершину v. Пусть A -- множество вершин, из которых есть дуга в v, B -- в которые есть дуга из v (тут ещё стоит напомнить, что для всех отличных от v вершин u либо u->v, либо v->u). Построим ответы для A и В -- эти последовательности обозначим за Ans(A) и Ans(B).  Утверждается, что последовательность Ans(A)vAns(B) является ответом для всего графа (в этом несложно убедиться).
      База: n = 1 -- очевидна.
      • 14 years ago, # ^ |
          Vote: I like it 0 Vote: I do not like it
        Здорово, натуральный qsort получается.
      • 14 years ago, # ^ |
          Vote: I like it 0 Vote: I do not like it
        Красиво. А что такое полустепень выхода?