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

Автор ir5, 14 лет назад, перевод, По-русски
Всем привет.

Сегодня я (ir5) и rng_58 — авторы раунда. Во время контеста вы повстречаете разных животных и попробуете решить несколько задачек для них.

Мы искренне благодарим координатора задач (RAD) за тестирование и прорешиваение, Maria Belova за вычитку английских текстов, и MikeMirzayanov за отличную систему.

Удачи!

разбор (lang:en)

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

14 лет назад, # |
  Проголосовать: нравится -45 Проголосовать: не нравится
Good luck and easy hacking!
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Animals  ? !!!!
If so including images will be nice :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
contest will be held in English?
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Oh no! Not bunnies again. :P
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Can my ratings change after this contest?, The last Div 1 i attended resulted in no change in my rating   
14 лет назад, # |
  Проголосовать: нравится +21 Проголосовать: не нравится
Oh my god. Two red writers. It'll be something.

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Hope the problems are amazing :D
14 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
Hope all is gonna be okay, with no crashes.
14 лет назад, # |
  Проголосовать: нравится +7 Проголосовать: не нравится
Admin has hinted us to keep a good book of mathematics during the contest !!!
14 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
Codeforces should include a div2 only ranklist too as rating of div 2 contestants dont depend on div 1(i think).
14 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

С удовольствием бы написал, но время для меня неудачное.

Будут когда-нибудь раунды не в 19:00?

14 лет назад, # |
  Проголосовать: нравится +32 Проголосовать: не нравится
C: x203
D: x3
По-моему, что-то тут не так :)
14 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
How to solve the D problem?
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится

    У меня сложность O(NKL + 22KK).
    Но я не до конца уверен в правильности своего решения.
    Сначала делаем подмену. Рассматриваем разности соседних лампочек (или что там было).
    Теперь одна операция - это изменение двух лампочек на расстоянии a[i]. А всего надо поменять  ≤ 2K лампочек. Строим граф с вершинами (0, 1, ..., n) и ребрами между u и v, если |u - v| = a[i]. В нем находим БФСом попарные расстояния между вершинами, которые надо менять. И в полученном графе из  ≤ 2K вершин находим минимальное по весу паросочетание (тут как раз у меня только примерное доказательство правильности).

    UPD. Прошла. Значит, все таки правильное решение.
  • 14 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +8 Проголосовать: не нравится

    Sorry, it's in russian:
    Рассмотрим граф, вершины которого - стыки между клетками поля (ну и края тоже). Ребра - возможные отрезки, которые можно флипать, то есть все длины приложенные во всех местах. Если в каком-то стыке есть переход от принадлежащего Х к непринадлежащему, то в этом стыке должно быть нечетное количество краев флипнутых отрезков, иначе - четное. Ясно, что нечетных стыков будет не больше 20 (2K). Получили задачу: есть граф из 10^4 вершин и 10^6 ребер, выбрать сабсет ребер, чтобы у указанных (не более чем) 20 вершин была нечетная степень, у остальных - четная.
    строим матрицу кратчайших расстояний между этими нечетными вершинами (20 бфсами), потом динамика по сабсетам. Сабсет - уже удовлетворенные нечетные вершины, переход - выбираем, какую пару неудовлетворенных нечетных соединить путем.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Видел твое решение, явно не с помощью clocks() :-D
    • 14 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      Could someone give a short discription (a general idea, or just a short hint) in English ^^? :)
14 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Отличные задачи, отличный контест)
Жаль так и не смог во второй задаче проблему со временем устранить ><
14 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
4ый претест по C вводит в грусть ... что это было ?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
How to solve E problem
14 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится
A,B,C very easy!!!
D,E very hard!!!
i think problem C must be harder than this!!!
thank's for author's!!!
  • 14 лет назад, # ^ |
      Проголосовать: нравится +2 Проголосовать: не нравится
    Yes. This problemset leaves no room for error, the competition for most of participant was to solved 3 problems cleanly and faster, only to write not to think. With a deep respect for rng_58, i think that it's not a good idea to give 3 easy problems and 2 hard problems
    • 14 лет назад, # ^ |
        Проголосовать: нравится +19 Проголосовать: не нравится
      I just can't go past this accusation (even if with "deep respect") without replying.  

      First of all, problems of this round were written not only by rng_58, but also by ir5.

      Second, all accusations in bad balance should never go to problem writer. It is hardly possible for a problem writer to estimate the difficulty of his/her problems correctly. In most cases, writer's estimate is lower than the actual difficulty. Much more exact estimate is usually done by people who test the problem.

      So, if you want to blame somebody for bad balance, it should first of all go to people who tested the problemset. But even a better thing would be not to blame anybody, especially if the problems are nice (what, in my opinion, is definitely the case with today's D and E).

      Practice shows that it's much easier to estimate difficulty of problems when the overall idea / approach is relatively straightforward, it then depends on the length / complexity of implementation and on popularity of algorithms / theory involved, overall it is quite easy to measure. When the idea is non-straightforward, making a difficulty estimate is very difficult. However, such problems are the best that one can meet at programming contests. While perhaps not everybody would agree with me, I personally think that bad balance is much better than boring problems.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +12 Проголосовать: не нравится
      I want to say that we did not intend to set problems with such a bad balance - just we, the judges, did not estimate D was too hard. This misestimation occurred because the solution of D looks simple to think up and not so heavy to implement, if you know it.
      As for me, I expected at least 30+ contestants would solve D correctly, but the result was only 6 ACs.

      Overall, it seems that A,B was all right. C was solved by 200+ contestants, so I think C was actually not so very easy.
      D,E are solved by only about 10 people yet. I believe those(D,E) are nice problems and you may learn something here.

      ---
      Thank you for comments, Sir ivan.metelsky.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Problem D and E are very, very difficult for me!
I could find no clue to solve...
I'm waiting for editorials.
14 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
Знаю что не важно,тем более контест закончился, просто заметил в С опечатку:
Написано : К счастью, ей вскоре повстречался ее друг — бобром Таро.
Как мне кажется правильно: К счастью, ей вскоре повстречался ее друг — бобр Таро.
Если не сложно исправьте.
14 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
хотел про опечатку написать
пока с глючным инетом боролся fsb4000 уже написал про неё.
теперь хз что с этим дурацким комментом делать...
14 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Как обидно, D сдалась, а C упала из-за глупой ошибки :(
14 лет назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится
I have a suggestion concerning pretests. Currently, if one locks a problem, he is unable to submit it again. Still, it would sometimes be nice to know if a particular (wrong) solution is caught by pretests.

Suppose one is hacking others' solutions and searches for a particular bug. When a solution seems to contain that bug, one is likely to challenge. Now, if the bug was in fact covered by pretests, he is surely wrong and is wasting time (and points if he is impatient with hacking). On the other side, if the bug was not covered by pretests, then the time is not surely wasted.

I propose that after locking a problem, one can submit solutions for that problem, they are checked on the pretests, and the result is reported back.

An existing way to get the same information is to first write and submit the wrong solution, and then submit the right one. But this way, it costs additional and points for the resubmission and for the time taken to write the wrong solution first. In my opinion, being able to get this information without the penalty would be fair and won't cause any harm when the problem is already locked.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Argh I had a 1-line bug for C =(
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
What is the killer case in C-Problem!?
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    I can think of some -
    1) [For cases not handling nested bad substrings]
    abcdef
    2
    bc
    abcd

    2) [For cases with prefix or suffix of original text as answer]
    abcdef
    1
    abcde (or "bcdef")

    3) [For TLE]
    aaaaaa....(10^5 times)
    10
    a
    aa
    aaa
    ...
    aaaaa...(10 times)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Thx for your analysing.
      That means, C was the problem that may include various bugs!

      I didn't notice (1) case because my solution is not affected by such a case :0

      By any chance , the cause of much WA is (1)?

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

Кому не лень, посмотрите http://pastebin.com/EUGZhij6

Где там ошибка ?..

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
+0 rating change. heh!

Damn it, I missed problem C only because I took too long hunting bugs in my implementation for the first two problems. Even though I think I had the solution for C right away when I read it, but had too little time to implement it.

Art of implementation... what does it take to master it?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Тупая опечатка и +14 к номеру места%)
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

EDIT: омг, и правда) спасибо)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
hi i am new to codeforces .... And two of my solutions got rejected. one during system testing and one during pretest. Can i know anyhow which testcases were failed . plz reply

  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Click submission ID on "My submissions list"
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    You can find it by clicking "my submissions" in contest menu, and clicking on submission number - after your code there'll be protocol of testing system, including tests, your program's answers and right answers.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
I suspected 0(n*m*m ~ 10^7) might hamper.Instead I used Kmp for preprocessing then applied DP . It costed me time :(
14 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится
Этот баг научит меня всегда писать (int) перед беззнаковыми:
for (int j = 0; j <= s.size() - as.size(); ++j) 
RE#12 :(
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    Однажды на ТС из-за такого бага я занял >100e место вместо примерно 20-го. С тех пор да, (int) пишется всё время и на автомате ;)

    Кстати если Вы тоже используете компилятор g++ (насчёт студии не знаю), опция -Wall помогает отлавливать такие места, если они вдруг ускользнули от внимания. Да и вообще -Wall помогает против кучи глупых ошибок.

    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ага, я с таким и в этот раз компилила, вот только именно на этот варнинг привыкла забивать (на самом деле, ещё на варнинг относительно scanf'а :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Ой, Аня, это ты =) а я в профиль не посмотрел, так официально на "Вы" обратился =) Этим летом поедешь в ЛКШ? ;)

        А ты под линуксом, видимо, пишешь? У меня в Windows MinGW на scanf не ругается даже и со включенным -Wall. Ещё настоятельно рекомендую не забивать на ворнинги касательно приоритета булевых операций друг с другом (suggest parentheses around '&&' within '||') и с арифметическими (suggest parentheses around '-' inside '<<'). В последнем случае так вообще можно искать ошибку долго и упорно, если захочешь получить маску из единичек с помощью 1<<n-1, а не (1<<n)-1.

        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          У меня прекрасно ругается. Четвёртая версия.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            D:\Olimp\Season 2010-2011\codeforces\71>g++ --version
            g++.EXE (TDM-2 mingw32) 4.4.1

            Cтранно...
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ага :) И к ЛКШ (август), и к линуху
          А за приоритетами стараюсь следить, в смысле только если точно знаю, у кого меньше, не ставлю. Хотя некоторые придерживаются мнения, что нужно знать все приоритеты
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      ещё можно -Wextra, хотя там уже мало чего полезного.
      а чтобы ничего случайно не пропустить, можно -Werror добавить :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Расскажите пожалуйста как решать задачу С.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Давайте будем перебирать начало ответа справа налево.
    Будем хранить максимальную длину ответа на предыдущем шаге.
    Как пересчитывать - если мы сейчас стоим в позиции pos, и никакая из bi не является подстрокой s, начиная с pos, то мы можем увеличить ответ на 1 - ничего не испортится.
    Если хоть одна из bi является подстрокой, то очевидно, что такую длину мы брать уже не можем. Поэтому новый ответ будет равен минимальной длине совпадающей строки минус один.
    Итого решение за O(|s| * suml) (где suml - суммарная длина всех строк  = 10 * 100) - прекрасно укладывается в TL.

    Некоторые забывали проверить, что тупое решение укладывается и писали КМП или Ахо-Корасик :)
  • 14 лет назад, # ^ |
    Rev. 7   Проголосовать: нравится 0 Проголосовать: не нравится

    Расскажу альтернативное решение для маньяков. Как делать, если ты настолько тупой, что не можешь доказать элементарную жадность? Конечно же, писать динамику!
    Для каждой неклёвой подстроки тупо посмотрим все её вхождения в исходную строку и для каждой позиции в исходной строке будем хранить две битовые маски - какие подстроки в ней начинаются и какие заканчиваются. Потом динамика такая: параметры - текущая позиция в строке и маска тех неклёвых подстрок, которые начались, значение - максимальная длина набираемой подстроки; в переходах маски начал плохих подстрок надо аккуратно складывать, а с масками концов - очень аккуратно перемножать. Работа над всем этим счастьем у меня заняла всего-то 79 минут, да при том, что я ещё зачем-то предварительно причёсывал набор стрёмных подстрок, чтобы они точно не были подстроками друг друга.
    P.S. Позабавил товарищ подполковник, который, видимо, посмотрев на мои тонны кода, решил, что это должно отловить TL. Не, я, конечно, дурак, но не клинический всё-таки - предполагать, что на контесте по системе Codeforces я не проверю решение по такой задаче с грубой оценкой асимптотики самой трудоёмкой части алгоритма в O(|s|*2n*n) на простеньком макстесте, - это, простите, обвинение в вопиющем непрофессионализме.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      О, нет, я не Вас имел ввиду :)
      У кого-то просто увидел такой код.
      • 14 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        Это я понял, что не меня (у меня же нет ни КМП, ни Ахо - Корасик), да и странно бы это как-то было - с чего бы Вам мой код смотреть, если мы были в разных комнатах? :)
        Я имел в виду того, кто пытался меня взломать.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      есть гораздо более простая динамика за O(s*n).
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
By the way, I think that the icon of ir5 is cool!
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
How was C solved ?
Is it DP ?
Is DP necessary ?
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    No, dp isn't necessary if you want to solve this problem. For example I solved it using bin search.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Can you please explain a little, on how to use binary search here?
      • 14 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        This is my idea: binary search on the length of interval.

        Let's fix the length of interval - x:
        - you check every interval of length x in an original string, and look for any, without boring strings inside;
         - you want to check if s[i,..,i+x-1] contains j-th boring string;
        - search b - the first beginning of occurence of boring string j in string s >= i
        - search e - the last ending of occurence of boring string j in string s < i+x
        - check if e-b+1 >= length of boring string j

        You can avoid checking each boring string for each fixed interval if you construct table right[] from the editorial, and look for minimum at checked interval.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
I come from CHINA.
The server was too slow yesterday, I used 40 minutes to lock a problem  and it was too hard to view others' solutions ...
Everything was ok on previous contests ..
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
I recived this mesage :I'm glad to invite you to take part in Codeforces Beta Round #72 (Div. 1 and Div. 2).At what DIv should i particate?