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

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

Задача A. Эпическая игра (автор - dudkamaster).

Авторское решение: http://pastebin.com/zRiQwy6u

В этой задаче достаточно было просто промоделировать описанную игру. Искать наибольший общий делитель можно любым разумным способом.

Задача B. Перед экзаменом (автор - Serega).

Авторское решение: http://pastebin.com/kBjCwiiD

Рассмотрим решение задачи для максимального уровня знаний; для минимума задача решается аналогично. Понятно, что максимальный уровень может достигаться либо на билете, который уже попался кому-то из студентов, либо на билете, точное содержание которого нам ещё не известно. Для анализа первого случая можно попутно с чтением входных данных подсчитывать уровни знаний по билетам и выбирать максимальный из них. Второй случай хитрее. Отсортируем все теоремы, не вошедшие в другие билеты, по невозрастанию уровню знаний. Понятно, что искомый билет будет состоять из первых теорем в этом списке. Однако здесь возникает один очень важный случай, которого и не учитывало авторское решение: для того чтобы такая ситуация была реализуема, необходимо, чтобы количество различных известных нам билетов было строго меньше общего числа билетов. Эту ситуацию демонстрирует, например, тест

3 2
1 2 3
2
1
2

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

Асимптотическая сложность решения - O(n(q + log(n)).

Задача C. Реформа образования (автор - Serega).

Авторское решение: http://pastebin.com/eZhJYGpC

Данная задача решается при помощи динамического программирования. Отсортируем все предметы в порядке неубывания сложности. Пусть d[i][j][z] - наибольшее суммарное число упражнений, которое можно задать, если расписание содержит ровно z предметов из числа первых i (в отсортированном порядке), включает в себя i-ый предмет, а количество упражнений по i-ому предмету равно ai + j.

Рекуррентные соотношения основаны на переборе предмета, который будет стоять в расписании в z - 1 день. Для восстановления ответа необходимо сохранить исходные номера предметов, а при вычислении динамики - сохранять предков.

Асимптотическая сложность решения - O(m2· n· max(bi - ai)).

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

Задача D. Преобразование строки (автор - Serega).

Авторское решение: http://pastebin.com/puGK1WYh

Если длины входных строк не равны, сразу выведем "-1 -1" и завершим программу. Иначе положим число n равным длине входных строк.

Будем перебирать число i. Научимся за O(1) понимать, для какого наименьшего j подстроку b[0... n - i - 1] можно представить в виде a[i + 1... j - 1] + r(a[j... n - 1]). Для этого посчитаем префикс-функцию (p[i]) для строки s1 = r(a) + '\0' + b и z-функцию (z[i]) для строки s2 = b + '\0' + a. Понятно, что для фиксированного i искомым значением j станет n - p[2n - i - 1], при этом подстроки a[i + 1... j - 1] и b[0..j - i] должны совпадать (1). Последнее утверждение несложно проверить, используя подсчитанную z-функцию. Также тривиально доказательство того факта, что если при фиксированном i свойство (1) не выполняется для выбранного нами j, то оно не выполнится и для больших j.

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

Задача E. Другая реальность (автор - Kenny_HORROR).

Разбор размещён здесь.

Разбор задач Codeforces Beta Round 90
  • Проголосовать: нравится
  • +24
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
А зачем в С сортировка нужна, там ведь проверкой можно обойтись. Асимптотика такая же, а восстанавливать решение немного проще.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Какая именно проверка имеется в виду?
    • 13 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится +1 Проголосовать: не нравится

      Проверка того, что C следующего предмета больше чем C текущего.

      Т.е. dp[i][j][xj-aj] - это суммарное количество заданий за i первых дней, если в i день мы поставим предмет j, и по нему поставим xj заданий. Тогда если c[j] < c[m], то dp[i+1][m][xm-am] = min(dp[i+1][m][xm-am], dp[i][j][xj-aj]  + xm).

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

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

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Прикольно, спасибо.
13 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Коль решение задачи было изменено, отсюда изменяется и условие... Изменилось оно в том, что стало непонятно (и это стало важно), одинаковы ли билеты, в которых вопросы поставлены в разном порядке (например в тесте 2 есть билеты "2 3" и "3 2").

UPD. Этот коммент можно не читать

13 лет назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится
А можно выложить то самое неполиткорректное условие?
Помню, на Тимусе была задача 1450, а ее пофиксили потом...
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я могу отправить его личным сообщением. Просто я не уверен, что администрация адекватно отнесётся к его выкладыванию здесь.
13 лет назад, # |
  Проголосовать: нравится +48 Проголосовать: не нравится
Реально, какая ещё политкорректность на codeforces?

"единая россия" - партия жуликов и воров!
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Подскажите, пожалуйста. Задача D, используя префикс-функцию и z-функцию,  r(a) + b - я найду так скажем, "концовку" первой строки, и b + a - найду "серединку" первой строки. а вот "начало" можно найти с использованием к примеру z-функции или префикс-функции? или это можно сделать обычным посимвольным сравнением и уложиться в данной задаче?
  • 13 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    Префикс и z-функцию мы используем уже после того, как зафиксировали начало (число i). Поскольку эти массивы были подсчитаны заранее, мы можем получить интересующую нас информацию за O(1). А сам префикс действительно можно перебирать обычным циклом, просто добавляя к нему по одному символу строки a и проверяя, что именно этот символ стоит в соответствующей позиции строки b.

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

Although this is a unreated round .. I am also get experience in this round ..
PS: I think Problem D is a good problem and it will have many many different solution.

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

what's the meaning of the z-function?
is it same with prefix function?

  • 13 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    No, prefix function tells you the length of the prefix that matches with where you are up to, that means that the last character in prefix will coincide with the character you are on.
    p[i] ->   s[0...p[i]] = s[i-p[i]....i]   

    The z function looks at the prefix too, but it searches forward, in other words, z[i] is going to tell you the length of the prefix that matches the substring starting at s[i] .
    z[i] ->   s[0..z[i]] = s[i....i+z[i]]
»
7 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Getting 'Denial of Judgement' error on my submission of Education Reform problem.

Any suggestions?

P.S. Code is a bit long