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

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

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

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

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я где то читал про Венгерку на месте 500. Я подумал, что Эдмондс не так уж сильно сложнее венгерки.
14 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
А мне вот не понятно как Div 1 Hard решать...
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Либо динамика по поддеревьям, либо жадность: каждый раз брать самый длинный путь и убирать.
    Я писал динамику по двум параметрам: кол-во использованных shortcut'ов и ведёт ли один из них наверх.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А входить в поддерево всегда по ребру?
      Я писал полагая что это всегда правильно, но у меня не проходят два теста из семплов. Вот думаю это косяк в коде или ошибка в предположении :о)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Косяк в коде :)
        • 14 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится
          стоп-стоп-стоп, во втором семпле мы входим в поддерево не по ребру
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Ой, правильно, можно входить не по ребру, ошибся.
            У меня это реализовано особенностью инициализации.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Мы ищем неориентированный путь. Внутри поддерева можно считать что входим всегда по ребру.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А жадность верна? Что-то я не заметил ни одного решения, кроме моего упавшего, работающего на жадности :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        fastest submission by zhuojie вполне себе жадный: http://www.topcoder.com/stat?c=problem_solution&cr=22686851&rd=14157&pm=11003
        • 14 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится
          А, вон как надо было жадно решать. Ну конечно, находить и удалять диаметр было неверным :) Как оказалось, надо было вдоль найденного диаметра проставлять стоимости, равные старым со знаком "минус"; в результате появляется возможность для отмены уже взятых в ответ рёбер.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится
    Эта задача меня проперла!

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

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

    Ну а теперь уже простая динамика для того чтобы понять, 1 или 2: какая минимальная суммарная длина взятых ребер (с учетом кратности), если в поддереве с корнем в V ровно K нечетных вершин.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Почитал едиториал - там сложнее гораздо объясняется )
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А я и не заметил что мои два параметра - это остаток и результат деления на 2 твоего K, кстати по коду это заметно :)
      k =k1+k2+(s1+s2)/2;
      s = (s1+s2)%2;
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Я блин провтыкал, что в 500 надо чоединять числа из разных строк. В результате у меня были числа 19 и 5, а не 195 в последнем примере... Обидно шо капец. Особенно если сейчас в практис руме пройдет.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Блин. Прошла.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Так сэмпл же не проходил?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Так да. Я и не сдавал, а сидел искал баг. Так и не нашел. Уже после челленджа меня Igel_SK просветил по поводу последнего примера.
        • 14 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится
          Читать комменты к семплам - это папство, да
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Я не спорю, это моя вина. Но согласитесь, обидно не сдавать задачу из-за такой мелочи.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Вот из комментов как раз не сильно становится понятно. Раньше сказали соединить и тут сказали. Как соединить - никто не сказал. Хотя конечно да - самое буквальное понимание - верное
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Тоже долго втыкал про 3-й тест. Почти под конец догадался. Зашла:)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    а я вот через пробел их склеивал и потом минут 20 перечитывал условие и думал, что же я не так понял, что не проходится семпл... хорошо что хоть за 20 минут до конца до меня доперло склеивать их без пробела :D
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Хм, я из-за этого много времени убил. Потом таки прочитал, что надо сконкатенировать строки.
14 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится
Забавно :)

  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    После матча всегда Score обновляется раньше чем сортировка
    Но при этом можно отсортировать список по Score, и лапками посчитать свое место :о)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Подскажите плз как решать 3-ию во 2-ом див.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +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). 
    • 14 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      еще можно так: f(n) = (n - 1) * (f(n - 1) + f(n - 2))
    • 14 лет назад, # ^ |
        Проголосовать: нравится +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, легко выделить в отдельную функцию.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Кто сможет найти баг в этом решени на 500-ку?
http://www.topcoder.com/stat?c=problem_solution&rm=305324&rd=14157&pm=10766&cr=22685398
Забавно, что оно прошло самплы и довольно много сист. тестов, но не все :)


  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    надёжно обнулил:
    forn (j, n) u[i] = 0;
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      ага, более чем :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Там у него ещё реализация такая что ищет два разных максимальных паросочетания. Понятно что на ответ не влияет, но прикольно :)
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          да, Кун в этом плане хорош, когда знаешь, что граф двудольный, можно явно не разбивать на доли, а непосредственно на нем строить. 
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
В 500 еще можно было решать рандомизированно - посчитать ранк матрицы татта т.е. просто написать гаусса. Хотя я решил не рисковать и написать Куна:).