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

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

Всем привет!

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

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

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

Разбалловка в первом дивизионе стандартная, а во втором: 500-1500-1500-2000-2500.

Gl & hf ! :)

Контест завершен. Надеюсь вам понравились задачи.

Победители в первом дивизионе:
1). marcina007
2). yeputons
3). gawry
4). KADR
5). enot110

Победители во втором дивизионе:
1). goie
2). Koblyk
3). Beriand

Идеи решений тут.

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

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

А какая разбаловка? Что-то давно не было динамической =(

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

I can't wait to participate in the contest!!!! I love codeforces!!!!

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

Good luck everyone

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

Less DP — more geometry!

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

Sereja рубит капусту на раундах codeforces

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

    та если бы не такие как Сергей то сидел бы ты на КФ и максимум тренировки решал

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

unfortunately I cant participate in this round but seems a great contest like all contest that Sereja have prepared.

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

good luck & good rating changes .

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

than contests author is Sereja my rating decreases, I hope that today this tradition will be destroyed;))))

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

Ignore this please. It wronged my meaning. . .

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

Where is score distribution?

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

а что означает Gl & hf ! :) ?

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

    good luck & have fun, что в переводе "желаю удачи и получить удовольствие"

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

"I strongly recommend you to read ALL the problems" — it does remind me of problems with close difficulty :P

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

WTF?? В 1 задаче тесты из условия решение проходит, но при отправке — ошибка на 1 тесте! Разве при проверке первые тесты не такие, как в примере?

»
11 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится
Комментарий удален по причине нарушения правил Codeforces
  • »
    »
    11 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    ну не знаю. Я ломал у меня все было норм хотя и на хроме) И как по мне то лучше обвиняйте не КФ и не хром, а ваш компьютер.

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

ААААААААААААААААААА!!!!!!!!!!!!! Сидел писал два дерева отрезков, второй назвал также как первый, только добавил цифру 1. и все методы рекурсивные таким же образом назвал. В общем, спустя одну минуту после окончания контеста понял что я из всех методов для второго дерева отрезков, вызываю методы первого. Обидно блин! UPD: в дорешке решение зашло. вдвойне обидно.

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

Great contest. Good Luck

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

very good system test speed thank you codeforces

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

Thanks for ultra-fast system testing :)

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

Чёрт, с задачей С на 11 тесте прям аномалия какая-то. Сначала было написал функцию, которая б по заданному закону изменяла массив, потом уже всё в мэин засунул. В конце концов упростил уже до такой степени, что осталось 2 массива (1, с которым производятся операции, и 2, псевдодвумерный, где, собственно, хранятся цифры для операций) и несколько циклов, в которых, собственно, и производится прибавление чисел. И всё равно пишет, что превышено допустимое время! — Уже не знаю, что там ещё можно оптимизировать >.<

И кстати, если глянуть, практически все как раз на 11 тесте и спотыкаются, многие и на времеи, дык что ж такого они там нагородили? о_О

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

    Не, я вот даже код выложу. Может, кто посмотрит и подскажет, что здесь неоптимального? =( http://codepad.org/Svk2WD4D

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

      Размер шрифта крайне неоптимален!

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

      Ваше решение делает число операций, пропорциональное n2, поэтому не укладывается в заданное время

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

        А можете тогда, если не сложно, хотя бы натолкнуть на мысль, какие есть более быстрые способы?

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

          Операцию transform можно делать так: завести еще один массив pref, и если приходит запрос l r, то сделать ++pref[l] и --pref[r + 1]. После этого a'[i] = a[i] + pref[0] + pref[1] + ... + pref[i], и все такие a'[i] можно посчитать за один проход по массиву pref.

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

Эх, зря перепослал :( В системе не оказалось теста, который валил первое решение.

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

Very nice and balanced problem set...One of the best contest I have ever participated in...

Thanks

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

Блин, обидно, что занял не 74, а 73 место :(

Контест писал в 47ой комнате и занял бы счастливое 74 место :)

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

good problems.thanks.

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

Сегодня на задаче С я понял, что надо избавляться от взятия по модулю везде, где только можно) Вариант с Iters*(N^4) взятий по модулю — ТЛ11 Вариант с примерно Iters*(N^4/30) взятий по модулю — 0.061с.

Или я где-то втупил, и первый вариант зацикливало...

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

    По-моему у меня было как раз O(N4) взятий по модулю. Не упало.

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

      У меня изначально на каждой итерации N^4 было. Точнее, M^2, где M — количество валидных комбинаций из больших и маленьких людей. Т.е. в худшем случае M=(N/2)*(N/2). А итераций пускал 200) Т.е. это около 80 миллионов взятий по модулю.

      Но только что я вообще завис, так как нашел в своем последнем (АС) решении гениальную защиту от переполнения:

      if (ways[moves][l1-i][l2-j]>overfl)ways[moves][l1+i][l2+j]%=bs;

      (обратите внимание на знаки в скобках)

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

    У меня на позапрошлом раунде был прямо противоположный опыт — практически правильная Е свалилась из-за отсутствия модуля в одном месте.

    Теперь у меня модульная паранойя. =)

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

How to solve problem B (Div-2) ..?

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

Hello, during contest I had trouble with C and got TLE status...

I tried to use a map to group the number of times each query needed to be used and did a double for loop to update answer...

I also think that some sort of Range Query algorithm would help, but I can't yet implement one. Can someone help me and describe a possible solution for C Div2?

Thanks in advance,

Bruno

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

    Use Binary Index Tree or Segment Tree.

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

    Or you can just use idea described in this editorial (problem C, two last paragraphs). That problem also was about intersection the segments.

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

    There exist O(N) solutions.Considering each operator (Li,Ri,Di),we add a[Li] with Di and minus a[Ri+1] with Di,then the sum of a[1] to a[i] is the change of ith number.We can count the times of each operator in the same way.

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

      So considering 1st example of the statement, how can we apply that approach? If we add + d to left element and subtract d from right element, how can we find the updated array?

      3 3 3 1 2 3 1 2 1 1 3 2 2 3 4 1 2 1 3 2 3

      Array is 1 2 3...

      1st query is 1 2 1, so array stays now 2 1 3 (?) and so on? :/

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

        We should calculate the times of each operators first. For each [xi,yi],add 1 to b[xi] and -1 to b[yi+1] The sum of b[1] to b[i] represents the times of ith operator. Multiply each times to corresponding Di and then apply the method above.

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

Thanks a lot for this hard contest. Both of my codes for problem A and C got "Pretest Past" but now both of the are Red! Also Thanks for this fast system test.

Now I get that an unrated user won the contest again!

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

Great contest!Thanks to Sereja and Gerald!

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

Nice problems overall, I really like the idea behind the solution of problem D, very clean, although it was an odd round for me I solved A, C and E.

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

I failed problem C (div 2) and I cannot find where my solution went wrong. (I'm using segment tree). May someone help me ? Submission.

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

My solution for problem A gets WA on the codeforces server but on my PC it's giving correct output for that case. Why is this happening? Could someone please help. Here's the code: http://www.codeforces.com/contest/296/submission/3511959

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

    In my blog you can find more about it. I faced this problem a few times. Here is a conversation about how to avoid this problems.

    HF & GL!

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

    int main() { cin>>n;

    rep(i,1,n) { int x; cin>>x;

    num[x]++;

    }

    rep(i,0,1010)
    //1010 is larger than your array's size, I change it to 1000 and your program output "NO" in "Custom Test"

    { D.x=i; D.n=num[i];

    if(D.n) v.pb(D);

    }

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

    rep(i,0,1010), but #define MX ( 1000 +3 ). I think this is the reason.

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

I tried to hack a code in problem C, which was plain brute force. I wrote a hack gen here but i got the error "FAIL Input can't start with empty line, but the first line is empty [validator wfval.exe returns exit code 3]"

Can any one tell the mistake so that I wont repeat it.

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

    Are you sure you've uploaded in source file field and not in input file field? I've got such error because of this previously and i see your source code starts with an empty line.

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

Ого уже и разбор есть!) Очень быстро сегодня и тестирование и разбор)

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

Tried to solve Div2 with DP lol. So much wasted time in debugging, and then saw the simple way :(. But this is one of those bad solutions that I am proud of http://codeforces.com/contest/296/submission/3514056

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

Div2 Problem C: I used the binary indexed tree approach...my code runs fine till testcase 11... Can any1 help me find my mistake? here's my solution http://www.codeforces.com/contest/296/submission/3512783

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

Thanks a lot for the contest! But:

Why didn't you make an illustration in Div 1 problem D?

It was annoying to read that text passage about sets/subsets, without an illustration showing what it's all about.

Even better (= more polite to contestants) would be to give a sample test like "3 3" or "2 3" and show (as pictures) all the valid caves in that pad.

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

could anyone please provide english version of the Ideas to problems page? If I click on translate button, only problem A is being translated to English, all other problems solutions are shown in Russian itself (they do not get translated). Thankyou.

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

Can anyone please explain the logic behind this solution of problem B of Div 2 ? I have having hard time understanding the dp state.

Thanks!

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

Can someone explain solution to probl C div 1 / E div 2 in more detail please ? Thanks!

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

    At first, note that we have only 2 type of people, let us call them "small" and "big" according to their weight. Assume some moment (state), then it can be defined by the number of "small" and "big" people on one shore and the position of the boat (the bank of the river it is adjacent to). Let the states be the vertices of the graph. It is understood that we can get from state to state with the help of the boat transportations. Therefore we have the directed (or undirected, it doesn't really matter) edge from one state to another if we can get from one to another by exactly one traversal. Obviously, the initial state is {0; 0; 0} (assuming we count people on the opposite bank, 0 corresponding to the initial bank, 1 — to the opposite), the final state is {n1; n2; 1}, where n1, n2 — the number of "small" and "big" people respectively.

    So the solution can be easily implemented by using breadth-first or any algorithm of finding the shortest path in the graph (because of quite small constraints). Moreover, you don't have to build the graph explicitly, you can do it implicitly (like me , for instance (: 3513759).

    The only thing you might still not understand is how to count the number of various ways to gain the minimal answer. Let us count in how many ways we can choose i people from x "small" ones and j people from y "big" ones. Obviously, that equals to C(x, i) * C(y, j), where C(n, k) = n! / (k! * (n - k)!). In such a way you can maintain another array that counts the number of possibilities and change it when you find the shorter path (assign the new value) or another path of the same length (add to the previous).

    Hope I made it at least a bit more clear to some contestants (:

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

      Great. Many thanks!

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

      Can someone please explain how we can have 72 ways for the following case?

      5 250

      50 50 50 100 100

      The minimum number of rides required are 3. My DP code(12225775) gives 46 ways and I have calculated it by hand as well giving the same answer.

      The possible moves are —

      1. Move 3 small people and bring 1 small person back — C(3, 3) * C(3, 1) = 3
      2. Move 1 large and 1 small and bring 1 small back — C(2, 1) * C(3, 1) * C(1, 1) = 6
      3. Move 1 large and 2 smalls and bring 1 small back — C(2, 1) * C(3, 2) * C(2, 1) = 12
      4. Move 1 large and 2 smalls and bring 1 large back — C(2, 1) * C(3, 2) * C(1, 1) = 6
      5. Move 1 large and 3 smalls and bring 1 small back — C(2, 1) * C(3, 3) * C(3, 1) = 6
      6. Move 1 large and 3 smalls and bring 1 large back — C(2, 1) * C(3, 3) * C(1, 1) = 2
      7. Move 2 larges and bring 1 large back — C(2, 2) * C(2, 1) = 2
      8. Move 2 larges and 1 small and bring 1 small back — C(2, 2) * C(3, 1) * C(1, 1) = 3
      9. Move 2 larges and 1 small and bring 1 large back — C(2, 2) * C(3, 1) * C(2, 1) = 6

      After either of these moves, all remaining on the left side are transported together to the right side in 1 ride.

      The total comes out to be 46. I am unable to find any other case. Can anyone please point out my mistake?

      UPD : Found the mistake. Was only considering cases in which a single person comes back.

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

Two coders form Poland in top 3! Nice to see :)

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

Screencast of me solving this round.

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

Could you please write an English solution?

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

I can't understand the statement of porblem c in div2 , what's the query stands for ? How to explain the sample tests ?

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

    Explanation of first testcase : Initially , the elements of array (a) are : a[1] = 1 , a[2] = 2 , a[3] = 3.

    We have three operations :

    operation 1 : 1 2 1 : increase every element a[i] with 1 <= i <= 2 by 1

    operation 2 : 1 3 2 : increase every element a[i] with 1 <= i <= 3 by 2

    operation 3 : 2 3 4 : increase every element a[i] with 2 <= i <= 3 by 4

    and three queries :

    query 1 : 1 2 , query 2 : 1 3 , query 3 : 2 3

    We have to execute the queries.

    by (a,b,c)--->(a',b',c') I mean the new state of the array after performing some operation.

    Query 1 asks us to perform operations 1 and 2. (1,2,3) ---> (2,3,3) ---> (4,5,5)

    Query 2 asks us to perform operations 1,2 and 3.(4,5,5)--->(5,6,5)-->(7,8,7)-->(7,12,11)

    Query 3 asks us to perform operations 2 and 3. (7,12,11)--->(9,14,13)--->(9,18,17)

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

What a pity! I just had a very little bug in Div.2 Prob A , or I would get a lot more Rating!

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

How I wish there is solution in English?

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

solution written in Chinese