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

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

Всем привет!)

Сегодня состоится очередной раунд Codeforces #205 для участников из 2 дивизиона. Традиционно, участники 1 дивизиона могут написать соревнование вне конкурса.

Подготовкой задач занимались Игорь Кудряшов (Igor_Kudryashov) и Геральд Агапов (Gerald). Кроме того, выражаем благодарность Михаилу Мирзаянову (MikeMirzayanov) за прекрасный ресурс Codeforces и Марии Беловой (Delinur) за перевод условий задач на английский язык.

Желаем всем участникам удачи, высокого рейтинга и удовольствия от решения задач)

UPD: В раунде будет использована динамическая система оценки задач.

UPD 2: Соревнование завершено, благодарим всех за участие.

Поздравляем победителей:

  1. hos_epic
  2. gzh1996n
  3. I_LOVE_ELE

UPD 3: Разбор задач можно найти здесь

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

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

жалко, что без див 1 :(

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

    ну так в чем проблема?
    Просто начни решать не с А, а с С, D, Е и посмотри как отрешаешь.

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

    Зато можно просто потренироваться.Это лишним не будет.

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

I will participate.

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

will the scoring system be static or dynamic?

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

Next Round is on Sunday. Awesome!!!

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

Желаю всем повыситься в рейтинге.

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

    Спасибо, конечно, но все в рейтинге не повысятся. Кто-то обязательно упадёт

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

Если при отправке решения я перепутал её название: хотел отправить решение А, отправил, как С, и получил штраф в 50 баллов, его (штраф) можно как-нибудь предотвратить?

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

    Вы не получили штраф, т.к. неправильный ответ на тесте 1 не считается за посылку.

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

      Спасибо. Конечно я могу ошибаться, но мне казалось, что изначально мне за задачу А дали 442 балла, после чего я попытался её переотправить (дабы улучшить решение) и перепутал А и С, и, наконец, ещё раз переотправил уже нормально, и добился своего. Правильно я понимаю, что штраф за это должен составить 50? (Однако балл уменьшился на 100)

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

        да, штраф за это составляет 50, но Ваш балл уменьшился на 100 из-за того, что с момента первой посылки прошло некоторое время, и стоимость задачи упала

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

Половина решений участников по задаче В посыпалась на 6-м претесте...)

Какой он коварный!

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

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

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

      что? Равного размера??? я идиот...

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

        Прописано же,что из кучки с 2*n фишек выбирается n фишек в первую, остальное — во вторую кучу.

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

          я прочитал, как "выбирается первая произвольно".

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

            У Валеры имеется 2·n кубиков, на каждом из которых записано целое число от 10 до 99. Он произвольным образом выбирает n кубиков и откладывает в первую кучку. Оставшиеся кубики образуют вторую кучку.

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

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

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

    4
    10 10 20 20 10 12 20 11

    Ответ:

    9
    1 2 1 2 1 1 2 2

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

The worst round I've ever performed. Sad... T_T

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

На чём ломали А? Что-то всю комнату посмотрел, ни на что не обратил внимания:o

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

Does anyone know what B — test case 6 is about?

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

    People say, that your programm could fall down because of different count of bones on both bags.

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

    Try this: 4 99 89 88 98 89 88 89 88 This should give 9 as answer

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

    There's one apparent reason that contributed to B being as hard as it was: the answer is (number of different numbers in first half)*(in second half); if there's a number occuring at least 2 times in the input, we should choose one copy of it to each half, and for the remaining numbers (occuring once), we could put them into both halves in any way (then, we complete the halves by putting the remaining copies of the numbers occuring at least thrice, and it doesn't matter how we do that).

    But since we want the answer to be as large as possible, we need to put half of those once occuring numbers to one half ad the other half to the other — the answer is (x + a)(x + b), when there are x numbers occuring at least twice in the input and a + b occuring once, and that expression increases as |a - b| decreases. Proof by taking the zero of the derivative (when we allow ).

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

      I struggle if you mean (x + a)(x + b) & that expression increases as |a - b| decreases.

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

        Yeah, that's what I meant. I wrote it in a hurry, so typos are inevitable :D

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

          Excuse me, does that mean that if we just sort the numbers and then in a sorted array will put all the odd indexed elements in one heap and all even indexed in another and just count the number of different pairs, since n is not big, we have a correct solution?

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

            No. It fails on the array "1 2 2 2 3 4 4 4" — you put 1 and 3 in the same heap (answer=8), but you should put 1 in one heap and 3 in the other (answer=9).

            But if you try this approach separately on once occuring elements and separately on multiple times occuring ones, it works.

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

            consider:

            1 2 2 2 3 4 4 4

            you'll get
            8
            1 2 1 2 1 2 1 2

            while correct answer is

            9
            1 1 2 2 2 2 1 1

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

    That is the 6th system test, which falls down my prog till now:

    50

    49 13 81 20 73 62 19 49 65 95 32 84 24 96 51 57 53 83 40 44 26 65 78 80 92 87 87 95 56 46 22 44 69 80 41 61 97 92 58 53 42 78 53 19 47 36 25 77 65 81 14 61 38 99 27 58 67 37 67 80 77 51 32 43 31 48 19 79 31 91 46 97 91 71 27 63 22 84 73 73 89 44 34 84 70 23 45 31 56 73 83 38 68 45 99 33 83 86 87 80

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

Как решать D?

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

    Я делал динамой, на каждом шаге считал значение "пробки" (если девушка, то прибавлял, если парень, то убавлял, не уходя в минус) и количество парней, которое, нужно пройти. Ответом будет сумма "пробки" и парней для последней девушки, вот собственно мое решение http://codeforces.net/contest/353/submission/4736196

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

    Я решал так: будем идти с конца строки в начало поддерживать количество девочек и время "простоя". Количество девочек равно количеству букв 'F' справа от текущей позиции, а время "простоя", числу, которое равно времени, которое должен подождать мальчик, чтобы начать меняться с девочками. Это число вычисляется следующим образом:

    • если s[i] = 'F', то уменьшим время "простоя" на 1, так как с этой девочкой можно будет поменяться и не ждать;

    • если s[i] = 'M', то увеличим время "простоя" на 1, потому придётся подождать, покуда этот мальчик пройдёт вперёд.

    Также нужно учесть, чтобы время простоя не опускалось ниже 0(когда отнимаем, время = max(время — 1, 0)) и то, что не нужно увеличивать время "простоя", если спереди нету девочек.

    Ответ будет равен max = (количества девочек + время простоя) для каждого мальчика.

    Вот решение: http://codeforces.net/contest/353/submission/4731757.

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

    Сначала найдем первого мальчика. Затем будем идти слева направо и поддерживать две величины: количество девочек, оставшихся слева и ответ для данного префикса. Теперь, если мы встречаем девочку то обновляем ответ для префикса:

    ans = max(ans + 1, i - cnt);
    cnt++;
    

    Где cnt — это количество девочек, ans — ответ для префикса.

    Почему это работает? Как только мы дошли до девочки, ответом для пройденного префикса станет время, когда эта девочка встанет на место (т.к. все девочки, которые слева уже будут на месте). Следовательно мы имеем два случая:

    1. Текущая девочка догонит предыдущую, т.е. она встанет на свое место на секунду позже предыдущей.

    2. Текущая девочка не догонит предыдущую, тогда она встанет на свое место за количество людей между ее текущей позицией и конечной позицией.

    Код

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

thanks for this great contest .......!!

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

What is the intended solution for E?

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

Задачи просто КЛАСС...!!! Спасибо авторам...!!!

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

It was fastest system testing i've ever faced on Codeforces.

Whole system testing phase just took 8 minutes. Codeforces Rocks!

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

very good and fast system testing today! :)

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

First time I solved 4 problems during a contest on codeforces :-D

I'm happy although it's unrated for me :-) Thank you for preparing this contest!

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

Что за тест 31 в задаче C? Что там такого, что не отсеклось на более коротких тестах?

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

I joined late , problem C is very interested .. isn't it guys ?

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

How solve the problem B??

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

    You can solve B with greedy assignment of the blocks.

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

    My solution: 4730199

    Idea:

    To solve problem B, you should put the number in balance (n numbers to heap 1 and n numbers to heap 2), to make the number of distinct 4 digit number maximum, if there are same number, say there are i number x (i>1, if i=1 it considered unique number that will be processed later), you should put (i div 2) number x into heap 1 and (i div 2) to heap 2, and if there are remainder (i is odd), save to heap 3 temporaryly (will be processed later).

    After that process the rest unique number (i=1) into heap 1 and heap 2 equaly, if there are j unique number, put (j div 2) to heap 1 and j-(j div 2) to the heap 2. And then the rest (heap 3) will fill heap 1 and heap 2 until full (have n numbers each, the order isn't important)

    Finally count the distinct number in heap 1, save to variable a and heap 2 to variable b, and the total distinct 4 digit number is a*b. and then just print the output.

    If there are more simple solution I would like to know :-)

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

Как решать С?

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

    Заметим: что если у нас есть маска 00101111 мы можем её превратить в 11001111 или в 11101111, т.к эти числа будут меньше исходного. Теперь можем идти по маске, если встретили ноль, то ничего не делаем, если встретили 1, то приводим к виду описанному выше и считаем сумму. Как посчитать сумму быстро. Для части левой от нуля можно подготовить массив сумм на отрезке от a0 до ai. Для правой части можно в самом начале посчитать в лоб и потом по мере прохождения по единицам убирать слагаемое из суммы. Код: http://codeforces.net/contest/353/submission/4736930

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

Lot's of DP problems. Love that contest though i miss A for some silly mistake. :( (Y)

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

    Actually any of this the problems may be solved without DP (except, maybe D, where solution could be called DP, but I wouldn't call it so)

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

Что-то странное творится, такой код локально работает мгновенно, а на ideone и тут в запуске TL'ится.

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

Any ideas of around when the tutorial will be published?

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

Раз ещё не спросили, буду первым.

Расскажите, кто-нибудь, пожалуйста, как решать Е.

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

    Я решал так — сначала найдем две одинаковых цифры подряд. Если такого нет, то все стрелки чередуются, поэтому ответ — n/2. Если же нашли, то начиная с этого места добавляем к итогу единичку либо за каждый "длинный" (более одной цифры) ряд из одинаковых цифр, либо за каждую пару разных одиночных цифр.

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

Awesome round. It is always a surprise when scoring goes dynamic. #Enjoyed. Looking forward for more matches of this kind.

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

nevermind

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

it was a awful contest!!!

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

У меня есть ощущение что авторское решение по Е неверно.

Судя по всему, оно на тесте 011001 выводит 2, а на тесте 101100 — 3, хотя ответ должен быть одинаковым, т.к одна строка- циклический сдвиг другой.

Точнее, это касается ухудшения моего решения с контеста. Решение на контесте не зашло, ухудшение — зашло.

Все, я дурак, извиняюсь.

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

    Не факт. Мое решение, получившее Accepted, выводит 3 на обоих тестах.

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

Стыдно просить, но подскажите пожалуйста идею решения задачи A(код участников смотрел, все равно не понимаю)

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

    Считаешь количество костей, у которых только одна сторона нечётная (достаточно хотя бы одну такую найти).

    Считаешь суммы нижних и верхних значений костей.

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

    Если одна из сумм нечётная — исправить невозможно, возвращаешь -1.

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

    ____Если таковые имеются — достаточно эту одну фишку перевернуть, возвращаешь 1.

    ____Если таковых нет — исправить невозможно, возвращаешь -1.

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

      Ну а если не думать, то можно написать динамику dp[i][s1][s2] — сколько переворачиваний надо сделать среди первых i доминошек, чтобы четность сверху была s1, снизу s2. Чтобы не упустить каких-то вариантов.

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

It is 70 minutes after the contest now and ratings are not published yet...

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

how the system testing is so fast and the rating is so slow? Isn't harder to judge than to update the rating? Maybe I'm wrong, but it would be nice to know.

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

wrong answer The number of cubics in first heap must be equal to 50, but it equals 54

Я все,конечно,понимаю,но при этом вариант,который выдает моя программа дает тоже 1936 вариантов. Так в чем проблема,можете обьяснить? (тест 6) Задача Б

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

    Из условия — Он произвольным образом выбирает n кубиков. Следовательно, если в разбиении кучки различаются в размере, то это разбиение автоматически не подходит.

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

      Ужас,спасибо большое,устал,условие прочитал невнимательно

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

    Нужно разбить кубики поровну

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

dynamic scoring and dynamic problems ! thank you

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

dynamic scoring system and dynamic problems ! thank you

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

Update: The original comment is my mistake.

(353B - Two Heaps, test 6)
I think Problem B judgement is wrong (the checker issues false negatives for some valid solutions).

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

    In the problem statement there is a phrase:

    "He arbitrarily chooses n cubes and puts them in the first heap. "

    So it IS necessary that the heaps have the same size.