Автор RussianCodeCup, история, 8 лет назад, По-русски

Всем привет!

Напоминаем, что 19 июня 2016 года в 14-00 по московскому времени состоится отборочный раунд Russian Code Cup 2016. В раунде могут принять участие по 200 лучших с каждой из квалификаций, 200 лучших в отборочном раунде получат футболку чемпионата, а топ 50 попадут в финал, который пройдет в сентябре, в финале участники сразятся за денежные призы.

Всем удачи и до встречи на http://russiancodecup.ru !

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

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

I'm wondering what does "Register at http://russiancodecup.ru and participate!" mean in the invitation email?

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

Что-то я не могу найти, а сколько времени длится отборочный раунд?

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

How to solve B? i got WA several times with ternary search.

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

    sort according to non-decreasing L[i] , now if u set number of left legs to L[i] , the number of valid pairs will be number of R[j] ≤ N - L[i] where 1 ≤ j ≤ i , so do coordinate compression and apply a BIT.

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

      A priority queue would do too. Always pop the queue whenever Rtop > N - L[i] because it will never be valid again as N - L[i] is non-increasing. The answer for taking L[i] as the number of left legs equals the size of the queue after popping invalid items.

      P.S. Hey fellow doge!! LOL

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

    I sorted the sequences increasing with respect to L.

    After that, I iterate in that sequence, let's say at step i we have Li as the left number:

    • Then the maximum right number is Ri = N - Li. Observe that in this way, Ri is decreasing
    • Since Li is increasing, we satisfy every note in respect to L before, the only problem is satisfying R queries before. So we use a structure (like a C++ map for example) that can get the values of R before that are greater than our current R — and we delete the values lower than our current R since Ri is decreasing. The answer for iteration i is the sum of values in the map. We get the maximum in every iteration.
»
8 лет назад, # |
  Проголосовать: нравится +24 Проголосовать: не нравится

How to solve E???

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

    For each i, compute two values:

    • The sum of values of all coins whose value is between [2i, 2(i + 1))
    • The smallest value of all coins whose value is between [2i, 2(i + 1))

    This will lead to an O(nlog2n) solution. However I'm not sure if this is intended (sparse table got MLE, segment tree got TLE, segment tree + pruning passes).

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

    There are absolutely no complex DS involved, at least in my solution.

    First, think about why it's enough to iterate "x -> 1 + sum of numbers up to x" for a given range until the sum is smaller than x. It's fast enough, since as we're iterating, x strictly increases and so the sum increases quite quickly.

    We can find sums in a given range using a Fenwick tree. We'll process numbers in non-decreasing order, add them to the Fenwick tree and deal with iterations in all queries at the same time.

    When we've just processed all numbers  ≤ x for some query's current x, we can find the sum for its next iteration, check if it's time to stop and if not, move on to the next iteration there. The current iterations for all queries can be stored in a set / priority queue / etc., from which we can take the smallest ones as long as they're less than the currently processed number. Time complexity: unknown, but it passed without any optimisations.

    UPD: Downvote logic on CF again. If I'm wrong, why not comment?

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

      You are actually right, it is N log N log K, where K=10^9. Each query will be processed log K times max, and they are in the priority queue.

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

    i used persistent segtree to get sum from L to R with values from x to y. It passes with coordinate compression.

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

So how to solve E?

I tried complicated O(n * sqrt(n) * log(n)) solution and got TLE on test 27.

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

    : let's add numbers one by one starting from the smallest, and maintain sums on the segments from queries. If we're adding number x and there are sums  ≤ x - 2, recompute them (and if they're still too small — we're done). The trick is, each sum will be recomputed logarithmic number of times: if it was s1, then s2 and then s3, then s3 - s2 ≥ s1.

    One pitfall is that Segment Tree is too slow here :( But Fenwick tree passes.

  • »
    »
    8 лет назад, # ^ |
    Rev. 5   Проголосовать: нравится +18 Проголосовать: не нравится
    S = 0
    while (true) {
       S2 = sum of numbers less than or equal to S + 1 on segment [l, r]
       if S2 == S
          break
       S = S2
    }
    print S + 1
    

    That can be done online with persistent segment tree code

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

      It looks like you uploaded a wrong code. It doesn't work on the sample, there shoud be inequalities on line 188.

      EDIT: OK, the bug is not here, now I don't know how to fix it.

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

        Yes, my fault. There should be += instead of = in line 249. I thought no one run the code which is posted as example:)

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

      I love this piece of your code:

      typedef int itn; :D

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

Правда же в Е такое?

если для некоторого отрезка мы можем получить числа от 1 до m, то если добавим еще число H к отрезку и H <= m+1, то сможем получить все числа от 1 до m+H, а m+H+1 не сможем?

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

    Да, правда

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

    Нет, не правда. Если в отрезке числа 1 и 3, то после добавления H=1 можно получить числа от 1 до 5.

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

      Ну я еще добавляю еще не добавленные числа, в данном случае я добавлю 3 после 2ой 1

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

    А сумма в лонгах хранится?

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

      да, у меня была проблема в лонгах, но мое решение ТЛ ловит на 27 все равно)

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

I was sad that I spent the whole contest trying to get D accepted, when I saw tourist and Petr failed it too, I'm completely fine with it now :P

Edit: Same code passes in the Gym in 300 ms, what was up with the time limit for this one?

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

А как дорешивать?

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

Что ж авторы задач в последнее время такие злые — E очередной пример задачи, где дерево интервалов не влезает, а Фенвик влезает. И это не первый пример такой задачи за последний год.

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

    А как решать в принципе задачу Е?

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

    Что? У меня 2 персистентых дерева отрезков спокойно влезли за .

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

      Если моё дерево интервалов чем-то не оптимально — я бы хотел узнать чем: http://pastebin.com/vn760NFx

      (а как персистентными деревьями решать? у меня обычными)

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

        Чтобы ответить на запрос, будем поддерживать сумму. Изначально она равна 0. Далее ищем минимальный элемент, больший суммы(для этого нужно первое персистентное дерево), пусть он равен x, считаем сумму элементов, меньших x(для этого второе), проверяем, что она не меньше x - 1. Если меньше, то ответ — сумма + 1, иначе добавляем x к сумму и повторяем эту операцию. Когда наша сумма больше всех элементов на отрезке, останавливемся и выводим сумму на отрезке + 1. Код.

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

    Обычное ДО нормально зашло — код.

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

      Ну что значит нормально? Ты написал дерево отрезков с памятью не степень двойки (поэтому у тебя нет ML). Я сначала написал на векторах и получил ТЛ, потом сделал массивы размера 33 и получил МЛ, а потом поменял их на массивы размера 31 и получил ОК. Плюс у тебя какая-то хитрость в нахождении ответа. У меня просто есть некая информация от любого отрезка, по которой я умею получать ответ для этого отрезка. В результате у меня один вызов функции снаружи. У тебя какой-то while. Ну круто, что :)

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

      Зачем писать свой merge? :)

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

    Ну так не зря в том году они Фенвика прям на футболку печатали, а я стебался еще

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

    У меня зашло двумерное дерево отрезков за O(n log^3 n). Видимо они тесты против какого-то конкретного решения делали (ну или против жавы)

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

    Ну не знаю, у меня персистентное дерево отрезков прошло с 1 попытки. А выше тоже жалуются, что у них дерево отрезков ТЛится...

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

    Мое ДО тут на КФ прошло с двухкратным запасом. Сложно сказать, что там со скоростью на RCC, конечно

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

    Что-то несправедливо тебя задаунвотили, это правильное замечание. Да, я даже не пробовал дерево отрезков, сразу делал фенвика на это. Особенно печально что оказывается задача уже была, я был шокирован увидев на 15-ой минуте сабмит по ней.

    Ну и понятно что можно было персистентное писать, просто я их не люблю :)

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

201st. Nice.

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

Сегодня я побуду тем парнем, который постит "задача Е — баян!": https://www.codechef.com/JAN14/problems/FRBSUM

Правда мне это не помогло: пока я подгонял константу в решении, я потратил 4 бревна :(

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

    Интересно, а вот нафига задачи, которые уже где-то были включать в контест? Видимо, жюри не знало о её существовании, да? )))

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

      Разумеется, этого не избежать :) Это был не комментарий из серии "тур говно потому что задача баян", а комментарий из серии "вот какой забавный факт".

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

    F была в этом году на каких-то сборах. Мне сокомандники решение рассказывали. :)

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

For B,If there are multiple solutions, output any of them? Why did I always get WA on test2...

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

Duh, how is that so many people solved E and some even in 7 minutes :f? I managed to get it ACed, but I think my idea is not that straghtforward. I divided numbers from input into intervals [2k, 2k + 1) and for every such part I built a segment tree taking minimum on interval and prefix sums. Then I did this:

    RE (_, q) {
      int a, b;
      cin>>a>>b;
      int cur_z = 1;
      REP (l, L) {
        int m = tree[l].Read(a, b);
        if (m <= cur_z) {
          cur_z += prefs[l][b] - prefs[l][a - 1];
        }
      }
      cout<<cur_z<<"\n";
    }

But it still needed a bit of stupid optimizing since I got TLE.

Is that a case that many people had prewritten some structure like "what is sum of numbers on interval [l, r] not larger than x?"

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

    Not the first time most important problem of RCC elimination round is from some other contest. Copy-pasting doesn't take that much time.

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

    I spent about 10 minutes. Copy-paste of Fenwick tree (+2 minutes) and fast input-output.

    1. Well known greedy

    2. We see 2D-queries

    3. To solve the problem in offline sort queries and use Fenwick tree. Implementation is short, 25-30 lines of not copy-pasted code

    P.S. Some people said the problem was on CodeChef contest. For me it was a new one.

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

The problem E is the same as this problem (editorial).

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

чот бревен сегодня как-то многовато :с

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

How to solve problem D??

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

    Greedy algorithm. First fill all containers to minimum volume. Then, start filling the containers to maximum volume in the order of increasing pi. When filling a container to volume v, reserve of reagent ci and of any reagent (you need to track the total volume of unreserved reagents).

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

      Do you have some ideas why this has enough precision (I'm asking partly because my extremely similar solution failed because of a precision issue)?

      It looks like you're operating with numbers as large as 1e10, then the error we get on each operation there is around 1e-6, so it seems unexpected that we can get an answer that's checked with tolerance 1e-6 and pass?

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

        In the first part of my program (when the containers are filled to minimum volume), both sumv and sumcap are integers, so there is no rounding errors here. In the second part (when the containers are filled greedily), sumv is an integer until the very end. In the last part (when the answer is generated), there are no values as large as 1010. So, the only interesting place is the second comparison between sumv and sumcap. Well, it works for some reason, quite possibly because of weak tests. In my submission, EPS is 1e-9, but it was mostly a guess.

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

          Thanks — keeping everything in integers as long as possible is pretty clever! Although as you point out, it doesn't seem to help for the worst possible case.

          I've looked at both reference solutions, and they use eps liberally here and there, so maybe the contest authors know why there is no big precision loss here?

          In my solution, I've used the same trick with multiplying certain numbers by 100 to avoid imprecision there, but switched from integers to doubles slightly earlier, and maybe have a less lucky eps.

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

          Yeah, it looks like this problem is unsolvable without BigIntegers. Here's a testcase where we can actually pour out all liquid except 100/lcm(1,2,3,..,100) which is about 1.5e-39. So the correct answer is NO, while I expect all passing solutions to output YES.

          1
          25 26
          1 10000 1 100
          1 10000 2 99
          1 10000 3 98
          1 10000 4 97
          1 10000 5 95
          1 10000 6 94
          1 10000 7 93
          1 10000 8 92
          1 10000 9 91
          1 10000 10 89
          1 10000 11 87
          1 10000 12 86
          1 10000 13 85
          1 10000 14 83
          1 10000 15 82
          1 10000 16 81
          1 10000 17 79
          1 10000 18 74
          1 10000 19 73
          1 10000 20 71
          1 10000 21 67
          1 10000 22 64
          1 10000 23 61
          1 10000 24 59
          1 10000 25 53
          18 8 41 83 40 15 22 5 14 46 24 12 15 7 16 79 75 5 54 13 9 5 6 22 24 142
          
          • »
            »
            »
            »
            »
            »
            8 лет назад, # ^ |
            Rev. 3   Проголосовать: нравится +107 Проголосовать: не нравится

            I hope one day people finally understand that problems with yes/no answers and double are bullshit

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

              Well, they are not bullshit, if say in statement something like "if change all parametrs within blablabla, answer will not change". But probably it can be hard to validate.

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

                Well, it's almost always hard to validate and/or create adequate tests (i.e there should be tests where params within 2*blahblah and that may break smth) and/or nobody cares

                If that's done, I agree that's OK

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

not the first time.... and this passed sample and wa at test 4...

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

The contest in GYM: 2016 Russian Code Cup (RCC 16), отборочный раунд. Welcome to practice!

Thanks for organizers and jury. I liked it!

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

Как решать C?

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

    Заметим, что все вершины должны иметь степень  ≤ 3, а корень —  ≤ 2.

    Для каждой вершины посчитаем расстояние до самой далекой динамикой на дереве (сначала самую далекую в поддереве, потом в обратную сторону). Далее переберем корень (учитывая ограничение на его степень). Для каждого корня, очевидно, высота дерева будет той самой, которую мы посчитали в динамике, и, соответственно, ответом для него будет 2h - 1 - n. Выбираем корень с наименьшим h, выводим ответ.Код

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

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

      Можно ли как-нибудь такое за O(N) посчитать в произвольном дереве?

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

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

        я искал ближайшую вершину степени <3 к центру графа, как раз линия

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

        Можно найти две самые удаленные вершины в дереве. Для любой вершины одна из самых удаленных — какая-то из этих двух.

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

        Можно сделать то же самое в произвольном дереве с помощью одного простого ускорения: мы считаем максимум глубины среди почти всех детей в дереве кроме одного (X по порядку в списке смежности предка), а это максимум на префиксе от 0 до X-1-го ребенка и максимум с X+1-го ребенка до конца. Если предподсчитать максимумы на префиксе и суффиксе в вершине, то можно считать dp_up за константу. Естественно для удобства нужно перенести расчёт dp_up туда, где ему и положено быть — в предков :)

        Хотя конечно посчитать расстояние до концов диаметра существенно проще.

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

Каков дизайн футболок?

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

Еще отдельно хотелось бы выразить спасибо дизайнерам mail.ru за кнопку переключения языков в подвале страницы, наряду с такой важной информацией как:

int main() {
    cout << "Hello World" << endl;
    return 0;
}_

Я загрузил сайт, удивился английскому интерфейсу, потратил несколько минут на поиск смены языка (шапка страницы, профиль) и забил.

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

    Что мешало посмотреть в адресную строку и поменять en на ru?

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

      Это не то место, где я обычно ищу смену языка.

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

        а зря, самый универсальный способ на моей памяти

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

          Accept-Language самый универсальный способ :) Сразу в HTTP-запросе менять

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

            спорно, часто по ip страну определяют и уже по ней язык

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

Will participants not in Russia still receive shirts if we came top 200? I'm just curious as it wasn't clear on the website.

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

noooo