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

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

Всем привет!

Совсем скоро, 27 апреля в 19:30 MSK состоится Codeforces Round #243, автором которого являюсь я. Это мой одиннадцатый раунд на Codeforces и я надеюсь, что не последний.

Спасибо Геральду Агапову (Gerald) и Ярославу Твердохлебу (KADR) за помощь в подготовке раунда и Марии Беловой (Delinur) за перевод условий на английский.

Настоятельно рекомендую прочитать условия ВСЕХ задач.

Разбалловка в первом дивизионе 500-1000-1500-2000-2000. Во втором стандарт.

Gl & hf ! :)

Разбор.
Статистика.

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

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

Thanks for the recommendation. :)

This information might be handy during the competition.

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

Ого, даже оповещение по почте вовремя пришло Оо

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

Ура!!! Наконец-то раунд от Sereja!

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

    Скоро "Ура!!! Автор раунда Sereja" станет таким же баяном как "Желаю всем удачи!"

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

nice to have the regular rounds back :)

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

Another Sereja round to enjoy. Thanks and good luck to everyone :D

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

И снова раунд от любимого автора, будет интересно)

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

Русский делает тебя успешным:)

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

ًWhat's meant by Gl & hf ?

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

hey sereja ! u r my best consest writer. I think u prepare too smart problems :)

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

Time for some Sereja and [?] problems ... :-)

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

Lets hope for math/ad-hoc problems!

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

yeeeeeeeeeeeeeeeees , another Sereja round

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

yes , another Sereja round :D

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

3^5-ый раунд, однако.

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

I strongly recommend you to read ALL the problems.

Not usually written by other authors... :)

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

Эх, обидно пропускать раунд от любимого автора.

P.s. у меня предложение добавить авторов в список контестов в том числе и в те к которым обратный отсчет.

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

Thanks for your efforts for preparing problems:)

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

*standard — not standart ;)

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

А я уже надеялся что будут взломы...

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

Problem D : I think that you wanted to say : two cells are connected if they are adjacent in sAme row or sAme column of the table NOT : two cells are connected if they are adjacent in sOme row or sOme column of the table

Am I right ? ;)

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

DELETED

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

Задачки класса "давай домой во второй див". Чтоб хоть немного самооценку вернуть

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

    Ага) Жди меня и я вернусь! Мой родной див 2! Только влез я в див 1, Но домой пора! Будем вместе мы решать, Все халявки скоро. А пока го раунд ждать!:)

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

      Будем вместе мы решать, Все халявки скоро. А пока го раунд ждать, Выпью чайку кофе с горя! :)

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

        судя по размеру, в слове "чайкУ" ударение должно быть на "чАйку", а это как-то страшно звучит :)

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

What is the approach to solve Div2 C / Div1 A?

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

    Simple brute force in O(N^3) + Sorting in O(NlogN) should easily pass the time limit.

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

    Bruteforce, more or less. Try all possible ranges [l, r]; for each of them, put the numbers from that range into a multiset and the numbers not from it into another multiset. As long as swapping the largest number out of the range and the smallest number in the range improves the result (and you still have swaps available), swap them. Time: .

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

      So we have an O(N^2) for choosing the ends of the interval, but how can we do the rest in O(KlogN)?

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

        Since you are using a set, elements will be searched in O(log n) and you have to choose 'k' such elements.

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

          But inserting N elements with take O(N*logN) in a multiset. I feel the time complexity for this solution will be O(N^3*K*logN)

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

        As long as swapping the largest number out of the range and the smallest number in the range improves the result (and you still have swaps available), swap them.

        There are at most K allowed swaps and each can be done in (because multiset).

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

      Any way to solve it without multiset?

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

        Sort the numbers that you'd put into multisets otherwise and do the swapping the same way.

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

      Can you provide the link to a properly implemented solution? Thanks in advance!

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

    Bruteforce all l..r on array (for for), and try to calculate the best value on l..r by swapping worst values with best from 1..l-1 & r+1..n. I did it with sorting, but the best approach I saw is to create two piority queues "in, out" and take r-l+1 values from them (don't take more than "k" values from "out" queue)

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

Its a pity that, Div1 D is same as this ONTAK problem

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

Div1 D was same as this ONTAK problem

EDIT : Also it exist at stackoverflow

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

    Yes, it seems that it is a very well-known problem.

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

    Is there any detailed analysis of the complexity?

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

    The one on StackOverflow does not requires sides parallel to axis.

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

    Btw, I like how the answer on StackOverflow which is clearly the most valuable has -1 votes :)

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

      Because it just contains a link. Link-only answers are only valuable as long as the link is valid, so they are very susceptible to link-rot. One is expected to at least summarize the contents of the linked resource so that the answer does not lose its value if the link goes dead. Note that this particular answer does not even mention the title of the paper, which could be used to locate the resource later.

      Also I feel that pointing to a 23-page paper does not cut it for this problem. At the very least I would expect the poster to point to the page where the actual problem of finding squares is addressed. But I would really prefer to see a paraphrased overview over the algorithm, so that I can quickly examine whether it actually addresses the problem without reading through pages of scientific notation. Remember that Stack Overflow is for regular users not necessarily with a background in Computer Science.

      Stack Overflow still has the vision to create an archive of programming knowledge for the future, not just to make a single question asker happy for the moment.

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

what is the idea behind the problem D(div 1) ?

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

    I had an solution. A square is uniquely defined by its 2 top (or 2 bottom etc.) points. Split the horizontal lines into large (at least points on the line) and small (otherwise); then, there are just squares whose 2 top points lie on a small line, same for those whose 2 bottom points lie on a small line and 2 top ones on a large one.

    There are at most large lines. For each point on one of these lines and each line below it, you can also check if there's a square for which these are 2 right points. There are also these questions.

    How to check the existence of many pairs of points (out of which all lie on 1 horizontal line)? Just make a vector saying if there's a point with some x-coordinate. You can do this for many lines with 1 vector, taking just O(1) time per query + O(N) time amortized for filling and cleaning the vector.

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

    Or you could use the fact that unordered_set is extremely fast and write something very short like this: click ^_^

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

      Wow, that looks useful. I don't know more about unordered_set than it erasing a -factor in theoretical complexity (and decreasing the practical one) :D

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

      I really liked next comparation: vx[x[i]].size() < vy[y[i]].size() in HellKitsune's solution.

      I believe hides behind it, does it? How to prove that? :)

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

        After reading the code again, I think it is O(n^1.5)

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

        To be honest, I have no idea how to prove it formally. :(

        But informally, we will most likely achieve the highest number of iterations if for each point we minimize the difference between the number of points lying on the same horizontal and the same vertical line with it. It then only seems logical to assume that the worst case scenario for this algo would be when the points form a square, which would give us complexity.

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

У Вас было, что в задаче С (див 2) на семплы программа дает верные ответы, а система пишет "Неверний ответ на претест 1" или это было только у меня?

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

    Неплохо было бы выложить и код самой программы (http://pastie.org/).

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

    В компиляторе проблема.

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

    Нет. Небыло. Всё ок.

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

    Есть замечательная вкладка "запуск", с помощью которой можно следить за тем, как работает программа на тестирующем сервере.

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

    99% что у тебя неинициализированные переменные есть

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

      Похоже на то:

      x.cpp: В функции «int main()»:
      x.cpp:42:35: предупреждение: «p2» may be used uninitialized in this function [-Wmaybe-uninitialized]
         for(i=0; i=p1 && i<=p2) { i=p2;  continue; } else if(a[i]>a[s1]) s1=i;
                                         ^
      x.cpp:42:26: предупреждение: «p1» may be used uninitialized in this function [-Wmaybe-uninitialized]
         for(i=0; i=p1 && i<=p2) { i=p2;  continue; } else if(a[i]>a[s1]) s1=i;
                                ^
»
10 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

Paper for problem D and harder versions of it!!!

Link

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

    Uhm, this paper is about checking if set of points contains desired figure, not about counting them.

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

      But the algorithm can be easily used to count number of figures.

      It's proved in the article that there's at most O(N1.5) squares in the plane and existence of the square is checked using brute force over all possible candidates.

      I used this article to solve this problem. Is there faster approach than O(N1.5log(N))? log(N) is for checking if the point is in set and I think we can avoid that logarithm but what about better estimation than O(N1.5)?

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

How to solve B ? It was awsome. :)) But I did not get the idea.

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

    Deleted.

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

    n, m <= k : bruteforce by any possible first row
    otherwise : freese one row and calculate min changes in case of this row is unchanged
    6492596

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

    If n>10 or m>10 there must be at least 1 line that does not change. Then iterate all such possible line. We know one line, so we know vertical partition of initial table and can easily find minimum number of changes.

    If n<=10 and m<=10 iterate all possible first lines(2^m) and we know one line again.

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

И, как обычно..

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

very strong pretests
low chance for hacks

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

Такое чувство, что С была просто на "заметь, что 103 ≤ e".

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

when will the ratings be updated?

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

на Д по-видимому слабые тесты. Моя решение прошло, хотя не должно было. Локально у меня на некоторые тесты рабоатет 10 сек

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

    Проверьте в "запуске". На КФ тестирующие сервера очень мощные.

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

      запустил. На кодфорсе работает 3 сек (ТЛ — 2 сек)

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

        Может быть, задержка из-за медленного интернета?

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

          Надеюсь, это шутка

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

            А было бы прикольно — написал контест с хорошего анлима и n^4 зашел там, где надо было n^3.

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

              Написал за О(1), а из-за медленного интернета получил ТЛ

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

          При чем тут скорость интернета?

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

Div.1 B What about this case, what's the answer please? 3 4 10 1 0 1 1 0 0 1 1 1 1 1 1

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

I could not understand the problem C correctly until someone explained to me after the contest. a quote from the problem statement "the element of sequence a with the maximum index among the chosen ones must be equal to the element of sequence b with the maximum index among the chosen ones; remove the chosen elements from the sequences."

If the maximum indices of two chosen values are equal, it means you take same number of elements from the sequence, isn't it? Shouldn't the wording be "the index of sequence a with the maximum value" instead of "the element of sequence a with the maximum index"?

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

    This means that the last deleted elements must be same in both sequences.

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

    What's wrong with removing the same number of elements from each sequence? It's a perfectly valid move.

    But since taking any more elements than the equal ones seems to be a non-optimal strategy, "maximum value" should mean the same as "maximum index".

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

      That's a clear explanation. I now understand the problem statement :) Thanks!

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

    Though I got it correctly during the contest I still don't see why it wasn't smth like: "both prefixes should end with same number", which is shorter and easier to understand. Sometimes formal language is too formal.

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

      Yes, I feel that sometimes problems on CodeForces are about deciphering the problem statement rather than understanding it and then having insights. Some authors also seem to be really into mathematical symbolic notation :)

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

why is rating update delayed?

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

What exactly is the special point of test 22 of Problem B(Div 2)? Many got WA.

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

Good round, thanks.

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

Мое решение на div1 A слетело на тесте 1 1 -1 . На самом глупом тесте....

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

WTF? В RCC Warmup я ничего не решил, при этом сильно опустившись в рейтинге. Сегодня решил две задачи, сопоставимые по сложности с Warmup'ом, и опустился еще ниже. Капитан объективность тихо плачет в подушку.

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

The problems in div1 are pretty good except problem D. Problem D in div1 is so classic that so many people have solved it before (at least I knew several well-known OJs have problems almost the same). And its time limit is so tight I thought. I first used std::set but got TLE at pretest 13 several times. But I changed my code to use lower_bound in a sorted std::vector, I got accepted. That's why I thought its time limit is too tight somehow. Does anyone agree with me?

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

    No, I don't agree with you. Using operations like lower_bound take log N complexity, so you got complexity O(n^3/2 log n) instead of O(n^3/2) so you shouldn't be surprised that you got TLE. Even more — tests weren't in fact maxtests. They could have been more time-demanding.

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

    Besides, set<> has a large constant factor. Sorting is generally much faster than set<> operations, and this could serve as a lesson for you to prefer sorting in the future.

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

    I got my solution passed after changing from finding a point in O(log (n^2)) (i.e. 2 log n) to O(log n). Simply store a set for each possible x instead for all. However, I think the time limit is fine after all.

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

    Look at my solution 6490475

    Although I aware of N^1.5 solution, my solution, which base on two pointer method is O(N^2)

    If the test case is strong enough to contains test which is two far away parallel line ( <0,0>, <100000,0>, <0,1>, <100000,1>, ... ) my program would be easily TLE

    I realize it after the contest already end. So I'm lucky one to pass the problem D

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

At least to me, C/Div.2 was much easier to implement than B/Div.2. Any one thinks the same?

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

Ам, а где разбор или я чего-то не вижу дайте ссылку если есть заранее спасибо;

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

По поводу качества тестов к задаче D. Зачем сильно себя напрягать, если можно написать решение, работающее за квадрат:6505142? Оно на тесте из двух прямых q=i/2;w=i%2; работает 5 секунд, но это не важно. Авторские проходит.

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

    Я генерил тесты разбивая отдельно на тяжелые и маленькие. Странно, что так вышло :(

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

My solution for D problem got AC luckily. I have thought that the complexity of my solution is O(n^1.5) but it is really O(n^2). For each point, my solution calculate right points, below points, and right-below points, then use three pointer to count how many square. The complexity become O(n^2) in this kind of input:

20
0 1
0 2
0 3
0 4
0 5
0 6
6 1
6 2
6 3
6 4
6 5
6 6
6 7
6 8
6 9
6 10
6 11
6 12
6 13
6 14

Execute the solution with larger input (with the same type of above input), I have the following statistic: - In my computer, Intel Pentium 2.2GHz, n=100000, the time is 22.312s - In my computer, compile with -O2, n=100000, the time is 3.444s I can not try to run the solution in Codeforces because my input is larger than 256KB (my input is 1020KB)