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

Автор Egor, 16 лет назад, По-русски
28 июля в 19:00 MSD состоится очередной TopCoder SRM
  • Проголосовать: нравится
  • +35
  • Проголосовать: не нравится

16 лет назад, скрыть # |
 
Проголосовать: нравится -25 Проголосовать: не нравится
А зачем каждый раз сообщать, когда что состоится? Вроде, все подписаны на рассылку ТопКодера и знают, когда пройдет матч.
На мой взгляд, было бы неплохо обсуждать матч после его окончания и, возможно, для особо нетерпеливых писать разбор до того, как он появляется на официальном сайте.
  • 16 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +26 Проголосовать: не нравится
    Лично мне нравиться инициатива Егора. Всегда понятно где задать вопрос по предстоящему контесту, обсудить ход и результаты.
  • 16 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Я тоже "за" такие сообщения. Во-первых можно не посмотреть почту и не узнать про раунд, во-вторых здесь можно обсудить задачи.
16 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Есть мысли как решать 1000 из 2-го дива? ...
16 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Сделал тупейшую ошибку в Куне в 500-ке :( интересно пройдёт ли 1000-ка
  • 16 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    я 500ку слишком сложно сделал, конечно. Надо было заметить, что этот тупо паросочетание
    • 16 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      Я заметил. Но не заметил, что на двудольном, и сдал Эдмондса-Карпа. ><
    • 16 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      Тут простая логика работала: ну не может быть в обычном срме в 500ке паросочетание в общем графе, значит граф двудольный. Я сначала сдал, а потом уже разбирался почему же он двудольный. Но я все равно потерял кучу времени, потому что сначала начал решать другую задачу: где все три стороны должны быть в массиве, но ее  я решить не смог и поэтому начал перечитывать условие.
      • 16 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится

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

      • 16 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        Я где то читал про Венгерку на месте 500. Я подумал, что Эдмондс не так уж сильно сложнее венгерки.
16 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится
А мне вот не понятно как Div 1 Hard решать...
  • 16 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Либо динамика по поддеревьям, либо жадность: каждый раз брать самый длинный путь и убирать.
    Я писал динамику по двум параметрам: кол-во использованных shortcut'ов и ведёт ли один из них наверх.
  • 16 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +4 Проголосовать: не нравится
    Эта задача меня проперла!

    Пусть мы зафиксировали, сколько раз мы будем использовать каждое ребро дерева. Как тогда понять сколько нужно шорткатов? Это равносильно тому - сколько нужно добавить ребер к графу чтобы появился эйлеров цикл (так как мы каждое ребро используем хотя бы 1 раз, то граф связный)? А это, соответственно, просто число вершин нечетной степени пополам.

    Из этого кстати видно, что каждое ребро нужно использовать 1 или 2 раза - если 3, то заменим на 1 и ничего не изменится.

    Ну а теперь уже простая динамика для того чтобы понять, 1 или 2: какая минимальная суммарная длина взятых ребер (с учетом кратности), если в поддереве с корнем в V ровно K нечетных вершин.
16 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Я блин провтыкал, что в 500 надо чоединять числа из разных строк. В результате у меня были числа 19 и 5, а не 195 в последнем примере... Обидно шо капец. Особенно если сейчас в практис руме пройдет.
16 лет назад, скрыть # |
 
Проголосовать: нравится +6 Проголосовать: не нравится
Забавно :)

  • 16 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +1 Проголосовать: не нравится
    После матча всегда Score обновляется раньше чем сортировка
    Но при этом можно отсортировать список по Score, и лапками посчитать свое место :о)
16 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Подскажите плз как решать 3-ию во 2-ом див.
  • 16 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +1 Проголосовать: не нравится
    Если ни одно письмо не пришло по назначению, то така перестановка называется беспорядком пордка n. Затем, если ровно одно письмо пришло по назначению, то зафиксируем его и останется беспорядок порядка n-1. Если f(n) - количество беспорядков порядка n, то ответ это f(n-k)+f(n-k+1)+...+f(n). Теперь покажем как посчитать f(n).
    Пускай p(S) равно количеству перестановок, у которых элементы множества S стоят на своих местах, а все остальные элементы стоят как угодно. По принципу включения-исключения имеем:
    f(n)=n!-p({1})-p({2})-...-p({n})+p({1,2})+...+p({n-1,n})-...+(-1)np({1,2,...,n})=n!-n*(n-1)+n*(n-1)*(n-2)!/2-n*(n-1)*(n-2)*(n-3)!/3!+...+(-1)n=n!-n!/1+n!/2-n!/3+...+(-1)nn!/n!. Отсюда видно, что посчитать количество беспорядков порядка n можно за O(n), если предварительно предпосчитать факториалы и обратные факториалы. Отсюда следует решение за O(n2).
    Можно решить еще быстрее, если вынести за скобки n! и предпосчитать для k от 1 до n суммы вида 1-1/1+1/2-...+(-1)k1/k!. В таком случае сложность решения получится O(n+k). 
    • 16 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +1 Проголосовать: не нравится
      еще можно так: f(n) = (n - 1) * (f(n - 1) + f(n - 2))
    • 16 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +1 Проголосовать: не нравится
      Включение-исключение:
      C[K][0]*A[0] - C[K][1]*A[1] + C[K][2]*A[2] +C[K][3]*A[3] + ... - где A[i] - сколько вариантов таких что i фиксированных министров среди этих K получили получили свои письма, т.е. A[i] = (N-i)!
      Попробуем упростить C[K][i]*A[i] = mul(i, K) * mul(K-i, N-i) где mul(a,b ) это b!/a! = (a+1)*...*b, легко выделить в отдельную функцию.
16 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Кто сможет найти баг в этом решени на 500-ку?
http://www.topcoder.com/stat?c=problem_solution&rm=305324&rd=14157&pm=10766&cr=22685398
Забавно, что оно прошло самплы и довольно много сист. тестов, но не все :)


16 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
В 500 еще можно было решать рандомизированно - посчитать ранк матрицы татта т.е. просто написать гаусса. Хотя я решил не рисковать и написать Куна:).