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

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

509A - Максимум в таблице

В этой задаче нужно было сделать то, что написано в условии: построить таблицу(двумерный массив) по указанным правилам и найти максимум в таблице.

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

Также проходило и просто решение рекурсией:

def elem(row, col):
    if row == 1 or col == 1:
        return 1
    return elem(row - 1, col) + elem(row, col - 1)

Кроме того, можно было заметить в таблице Треугольник Паскаля и понять, что ответ — это

Готовил: riadwaw
Разбор от: riadwaw

509B - Раскраска шаров

Пусть найдутся две кучки, в которых количество камней отличается строго больше чем на k, тогда решения не существует:

Пусть теперь M = max ai ≤ min ai + k = m + k, покажем, как построить правильную раскраску:

  • покрасим по m камней в каждой кучке в первый цвет
  • в каждой кучке все оставшиеся камни покрасим в любые различные цвета(можно использовать первый еще один раз) (это можно сделать т.к осталось не более k камней.

Заметим, что 1-ый цвет встречается в каждой кучке m или m + 1 раз, а остальные цвета — 0 или 1 раз

Готовил: Kostroma
Разбор от: riadwaw

509C - Суммы цифр

Будем действовать жадно. На первом шаге найдём минимальное число b1 с суммой цифр a1. Далее, на i-м шаге найдём минимальное число bi с суммой цифр ai, которое больше чем bi - 1.

Почему это правильно? Поскольку b1 — минимальное число с суммой цифрой a1, то первое число не меньше чем b1. Далее по индукции: i-е число не меньше bi, поэтому (i + 1)-е число должно иметь сумму цифр ai + 1 и быть больше чем bi. Но минимальное такое число как раз bi + 1. Значит, построенный пример даёт оптимальное решение задачи.

Осталось научиться решать подзадачу: найти минимальное число с суммой цифр x, которое больше y. Она решается стандартным подходом: идем по цифрам числа y с младших разрядов и пытаемся увеличить соответствующую цифру (считаем, что каждое число содержит бесконечно много нулей слева от своей старшей цифры). Пусть справа осталось k цифр, тогда сумма этих k цифр может быть любым натуральным числом от 0 до 9k. Если получилось увеличить текущую цифру так, что при каком-то выборе цифр справа от неё получилась сумма x, то мы получили ответ. Заметим, что цифры справа от текущей позиции в таком случае нужно заполнять жадно с младших разрядов, каждый раз используя максимально возможную цифру — таким образом мы действительно получим минимальный ответ.

Оценим максимальную длину ответа, т.е. числа bn. Заметим, что если длина десятичной записи bi хотя бы 40, то в промежутке между 10k и 10k + 1, где k — наименьшее натуральное число, такое что 10k ≥ bi, есть числа со всеми суммами цифр от 1 до 9k. Так как все ai ≤ 300, то при в отрезке [10k, 10k + 1] есть любая из интересующих нас сумм цифр. Значит, при достижении 40-значного числа на каждом шаге количество цифр в десятичной записи bi увеличивается не более чем на 2, а значит итоговый ответ будет иметь десятичную записать не длиннее 640 цифр (еще немного подумав, можно понять, что эту оценку можно усилить до 340).

Значит, получаем решение за O(n·maxLen), где maxLen — максимальная длина ответа. Поскольку n ≤ 300, maxLen ≤ 640, такое решение с запасом проходит.

Готовил: Endagorion
Разбор от: Kostroma

509D - Восстановление чисел

Заметим, что если в корректном ответе ко всем bi добавить 1, а из всех ai вычесть 1 (и при необходимости добавив k), то ответ останется корректным. поэтому можно считать, что ai = 0, тогда из первой строки однозначно восстанавливаются bj, а по ним — ai (Можно пока разрешить им быть отрицательными, а потом добавить нужное число раз k). Теперь для любых i, j мы можем найти "ошибку" .

Если все ошибки нулевые — всё отлично, возьмем k достаточно большим и ответ будет автоматически корректным.

Для того, чтобы не нарушалось условие в клетке (i, j) необходимо и достаточно, чтобы ei, j делилось на k. Таким образом, k должно быть делителем gcdi, j(ei, j). При этом, k должно быть строго больше, чем все числа в таблице. Таким образом выгодно попытаться поставить k = gcdi, j(ei, j), что можно сделать, если k > maxi, j(wi, j). В противном случае ответа не существует.

Готовили: Kostroma, riadwaw
Разбор от: riadwaw

509E - Мелодичная песня

Посчитаем суммы vowel(si) на всех префиксах строки, чтобы за O(1) можно было легко посчитать сумму vowel(si) на любой подстроке.

Будем перебирать m с 1 до . При фиксированном m найдем сумму простых мелодичностей всех подстрок длины m. Для этого посмотрим, сколько раз i-й символ s входит в эту сумму.

При m = 1 каждый символ входит ровно один раз. При m = 2 все символы, кроме крайних — 2 раза, крайние 1 раз. При m = 3 все 3 раза, кроме второго и предпоследнего(2 раза) и первого и последнего (1 раз).

При m = |s| каждый символ входит один раз, как и в случае m = 1, а при m = |s| - 1— 2 раза кроме крайних, как и в случае m = 2.

В общем случае, i-й символ входит min(m, |s| - m + 1, i, |s| — i + 1) раз. Можно заметить, что при переходе от m к m + 1 к сумме прибавляются вхождения символов на подотрезке с m по |s| - m + 1(если m > |s| - m + 1, то убавляются на подотрезке с |s| - m + 1 по m).

Таким образом, можно легко пересчитать сумму вхождений гласных при переходе от m к m + 1, прибавив(убавив) сумму vowel на подстроке. Итоговое решение за O(N).

Готовил: zemen
Разбор от: zemen

509F - Контроль успеваемости

Рассмотрим произвольное дерево на n вершинах. Подвесим дерево за вершину 1, и пусть массив a — результат работы dfs-а. Тогда вершины поддерева с вершиной v, 1 ≤ v ≤ n, записаны в подмассив a[lv..lv + sizev - 1], где lv есть позиция вершины v в массиве, а sizev — размер поддерева.

Решим задачу, используя сей факт и ДП на подотрезках. Пусть задан массив a, и пусть e[l, r] есть количество деревьев, составленных из вершин a[l], a[l + 1], ..., a[r], т.ч. dfs, запущенный из вершины a[l], выведет вершины в том же порядке, в котором они представлены в массиве a. Тогда, если l = r, то e[l, r] = 1; иначе , где сумма берется по всем возможным множествам детей a[l], т.е. по всем таким k;pos1, ..., posk + 1, что l + 1 = pos1 < pos2 < ... < posk + 1 = r + 1, 1 ≤ k ≤ r - l, a[pos1] < a[pos2] < ... < a[posk] (вспомним, что в dfs-е дети перебираются в порядке возрастания). Однако даже при наличии ответов для подотрезков отрезка [1..n] решение с использованием такой формулы будет работать экспоненциально долго.

Финальная идея заключается во введении d[l, r]:  = e[l - 1, r], 2 ≤ l ≤ r ≤ n. Действительно, из вышеприведенной формулы следует, что d[l, r] = ([утверждение] определим как 1, если утверждение истинно, и 0, если ложно), а также e[l, r] = d[l + 1, r]. Таким образом, d[l, r] и e[l, r] для каждого отрезка вычисляются за линейное время; ответом же на задачу является e[1, n]. Итоговая асимптотика решения O(n3).

Готовил: DPR-pavlin
Разбор от: DPR-pavlin

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

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

круто, за 16 часов до контеста разбор) это получается он скрытым был, или просто никто не смотрел?

А когда по остальным задачам?

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

    Он был в черновиках. Время показывается на момент создания.

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

    E добавил.

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

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

      9657673

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

        Могу посоветовать разобраться начинать с теста "A". У вас выводит 2, хотя ясно, что подстрока всего одна.

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

          случай с длиной строки, равной 1 я не рассмотрел конечно, но это мое решение, которое я даже не послал во время контеста. Получается слишком большая погрешность, и я не понимаю, почему. :(

          насчет этого вы могли бы мне обьяснить?

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

            Ну тут дело не в длине 1, для строки АА тоже выводит 5 вместо 3. Я не читал ваш код, но может быть вы забыли где-нибудь +/-1 ?

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

Спасибо

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

Problem E can also be solved using DP as follows — The required answer is where . Define dp[i] to represent ls[i]. Then, dp[i+1] = dp[i] + h[n-i-1] — h[i+1], dp[0] = h[s.size()] where h[i] is the ith harmonic number. Link to my solution.

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

Super fast tutorial. Hope it will be finished soon and also problem D and E will be translated.

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

Задача F:

Тогда, если l ≤ r, то e[l, r] = 1

Почему так?

Да и каким образом может быть l > r, если есть последовательность a[l],a[l+1], ... , a[r]?

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

    Прошу прощения, конечно же имелось ввиду l = r )))

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

      спасибо, туплю что-то, мог бы и сам додуматься)

      И еще мне кажется, что тут опечатка:

      d[l, r]:  = e[l - 1, n].

      Должно вроде как быть d[l, r]:  = e[l - 1, r].

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

Альтернативный взгляд на E:

Рассмотрим одну конкретную позицию i, на которой стоит гласная, и её вклад в общую сумму. Введём число k = min(i + 1, n - i) (позиции 0-индексированные). Теперь рассмотрим различные длины (пусть длина равна m):

  1. m ≤ k. Символ встречается в m подстроках, вклад в каждую — , итого 1 за каждую такую длину.
  2. k < m ≤ n - k + 1. Мы достигли границы с одной из сторон. Символ входит в k подстрок из данного диапозона, т.е. вклад равен за каждую длину из этого интервала.
  3. n - k + 1 < m. Ситуация вновь меняется. Теперь нам мешает не только ограничение с одной из сторон, но и то, что всего подстрок длины m только n - m + 1. Поэтому вклад в подстроки данной длины будет равен .

Введём два вспомогательных массива, чтобы с их помощью быстро пересчитывать ответ.

Собирая всё воедино: вклад символа i равен k(1 + s1[n - k + 1] - s1[k]) + s2[n - k + 2].

Решение: 9658642

Мне также показалось, что авторское решение F слишком формальное, попробую описать своё. Пусть DP[l][r] — количество различных корректных лесов, описываемых подотрезком [l, r]. Будем считать лес корректным, если номера корней в нём образуют возрастающую последовательность, а также каждое дерево при удалении корня превращается в корректный лес. Легко видеть, что при таком описании ответ содержится в DP[1][n - 1] (снова 0-индексация). Теперь научимся пересчитывать ответ. Это делается достаточно известным комбинаторным приёмом — рассмотрим первый элемент множества и всю оставшуюся его часть раздельно. В данном случае это будет означать, что мы выделим первое дерево в лесу и добавим к ответу произведение числа способов задать ему поддерево на число способов корректно описать оставшуюся часть леса. Пусть мы рассматриваем отрезок [i, i + j]. Будем считать, что первое дерево описано на подотрезке [i, i + k - 1] (т.е., его лес описан подотрезком [i + 1, i + k - 1], а все оставшиеся на [i + k, i + j]. Тогда если a[i] < a[i + k], сделаем DP[i][i + j] +  = DP[i + 1][i + k - 1] * DP[i + k][i + j], иначе — проигнорируем подотрезок.

Решение: 9658715

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

Problem E: "If m > |s| - m + 1, then SP is decreased by the number of vowel occurrences in the substring from |s| - m + 1 to m." Shouldn't it be "from |s| - m + 1 to m — 1"? Consider the first example, IEAIAIO. For m = 4 the numbers of times characters are included form this sequence: 1, 2, 3, 4, 3, 2, 1. For m = 5 the sequence is as follows: 1, 2, 3, 3, 3, 2, 1. So SP decreased only by vowel from position 4, i.e. by vowels from |s| — m + 1 to m — 1. Second A is still included in 3 substrings.

PS "the numbers of times characters are included form this sequence" — did I write it correctly? If not, how should I write it in English? :)

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

    You're correct. The proper indices should be from |s| - m - 1 to m when decreasing and from m to |s| - m - 1 when increasing (assuming the indices are 0-based).

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

      Actually "increasing" indices are correct, I think :)

      Example: IEAIAIO.

      For m = 1 you have: 1, 1, 1, 1, 1, 1, 1.

      And for m = 2: 1, 2, 2, 2, 2, 2, 1. So position |s| — m + 1 = 7 — 2 + 1 = 6 is also increased.

      Proof by example, my favourite type of "proof" ;)

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

        Edited 2: All right, I was thinking in different index bases, that explains it all. Okay so here's the deal: In the editorial we're moving from m to m + 1 and using the old m to calculcate the indices, while you're using m + 1. The editorial still needs correction, but you get the idea :)

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

For problem D:

Let M be the maximum number in W

If K > 2 * M, the modulus will change by some constant. So we can assume that: 2 * M >= K > M.

Of course the trial and error approach wouldn't pass. We can first assume that k = M + 1 (or any other value larger than this). If this caused any error we can then change K only one time to (2 * M minus current element that caused the error in W). If it caused another error then the answer must be "NO".

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

I set maxLen 300 in Problem C... I accepted after I changed it to 340

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

In the tutorial of C Problem. The last two paragraph, 'than' equals to 'then'?... Why not maxlength is 34, cause 34 * 9 = 306 > 300?

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

Вы пишете разбор по задаче С: "Осталось научиться решать подзадачу: найти минимальное число с суммой цифр x, которое больше y. Она решается стандартным подходом:" А можно подробнее узнать как получить число больше заданного Y с суммой цифр X. Спасибо.

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

    После этих слов подход как раз и объясняется.

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

      Как раз после этих слов все объяснено общими словами. А можно где нибудь увидеть как это делается на практике, если это считается стандартной задачей.

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

        Ну вроде бы все также просто, как и написано.

        Одно из авторских решений: http://ideone.com/nfkE5n

        А вообще можно просто открыть решения кого-то из решивших

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

Can someone write more detailed idea or pseudo-code of problem C solution, when you need to find next least number with same sum of digits?

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

    Look at each suffix of previous number, from left to right. If suffix begins with diggit c and has n digits, then c+1<=sum<=9n We are checking this condition, while its right. Let's pretend its false for suffix with N digits. Then we are changing digit on (N+1)-th place from c+1 to 9, trying to get number with fixed sum. If we can't do this, then we changing (N+2)-th digit, and go on and on, while we don't get required number

    Example: If we have number 391, and number with sum 10 to find, then suffix 391, sum is 10: we can get sum from 4 to 27. Go to next suffix

    suffix 91, sum is 7: we can get sum from 10 to 18 (yes, we cannot get sum 10, but this is not important). Condition is false. Go to previous suffix to increase third digit

    4??, sum is 6, we can do this with number 406.

    This algorithm can be realise with recurtion.

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

Now all editorial are available.

We are sorry for a delay.

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

Dirty Vasya didn't clean the table in a year :D

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

Здравствуйте. Помогите пожалуйста, не могу понять решение задачи F. Откуда там берётся формула с суммой по всем множествам детей, почему там под суммой стоит произведение и как от этой формулы происходит переход к динамике, что нам даёт, что d[l, r]:  = e[l - 1, r] и e[l, r] = d[l + 1, r]. Это же по сути одно условие?

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

На первом шаге найдём минимальное число b1 с суммой цифр a1. Далее, на i-м шаге найдём минимальное число bi с суммой цифр ai, которое больше чем bi - 1.

Никак не могу понять обозначений. Почему "с суммой цифр a1", если суммы цифр у нас хранятся в последовательности b1..bn?

Есть ли решение задачи С по алгоритму из этого разбора на C++? Скиньте, пожалуйста.

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

hmm....it is not important but my submission for 509C got accepted while it actually fails with a simple test case:

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

can someone please explain me the tutorial of pretty song in a more detailed way....I am unable to get what is written here!! :(