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

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

Начнется сегодня, в 21:00. Приглашаю всех прошедших в отборочный этап участников перейти по ссылке на раунд. Традиционно, раунд продлится 100 минут и будет оцениваться по системе Гран-При 30. Победа в прошлом раунде принесла pperm86 100 зачетных очков и участие в финальном раунде! Кто обеспечит себе приглашение в Берлин сегодня?

Удачи!

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

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

Do you know how to determine who will win T-shirts?

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

    I know for sure! Check out the Awards section of rules.

    Top 150 participants of the elimination stage (more score points, then more problems solved, then with less penalty time) will receive a souvenire.

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

are the contest problem available in english also ??

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

After going through the link I'm getting "You can not participate in the contest because the registration is closed" ???

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

I have advanced to elimination stage(Yandex has sent me a email for this), but when i entered to round 2 i saw this sentence: "You can not participate in the contest because the registration is closed"

What's wrong???

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

Как решать C?

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

    Случай, когда компонента одна проверить легко. Научимся выделять случай, когда 2 компоненты. Заодно, сразу будем считать, что у прямоугольника-запроса обе стороны имеют длину хотя бы 2.

    Можно понять, что на границе нашего прямоугольника не может быть больше двух "отрезков" одного цвета. Проверить количество отрезков одного цвета на границе можно за О(1), предпосчитав частичные суммы количеств смен цвета на строках и на столбцах. То есть, если у нас больше двух отрезков, ответ сразу 0.

    Если у нас 1 или 2 отрезка одного цвета на границе, то нам нужно проверить, что строго внутри нашего прямоугольника нет никаких других компонент связности. Для этого в самом начале, выделим компоненты связности и из каждой выберем по одной клетке-представителю. Построим массив частичных сумм, который будет говорить, сколько в нашем прямоугольнике клеток-представителей компонент. Тогда мы можем легко посчитать количество компонент внутри любого прямоугольника с той оговоркой, что компоненты, прилегающие к его границам могут как учесться, так и нет. Но их не более двух, так что можно просто это проверить отдельно. Выходит O(1) на запрос и предподсчет за O(N^2).

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

      Sorry, i did not get your 3rd para. Can you please translate that for me?

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

упс

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

в E запихивается на плюсах?

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

    А откуда там ?

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

      У меня там O(1), не считая gcd.

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

      Нормальное решение тоже интересно узнать, конечно.

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

        Поскольку никакие два вектора не коллинеарны, то существует только одна тройка (d1, d2, d3) с точностью до домножения на константу такая, что d1·a + d2·b + d3·c = 0. Находим её, решая систему из двух линейных уравнений, делим на gcd(d1, d2, d3) и находим те вектора с координатами не больше n - 1, при вычитании вектора (d1, d2, d3) из которых хотя бы одна из координат вылезает за отрезок [0, n - 1].

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

          А можно поподробнее по поводу нахождения такой тройки (d1, d2, d3)?

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

            У нас система из двух уравнений вида d1·ax + d2·bx + d3·cx = 0, положим d3 = 1, найдем решение системы линейных уравнений 2 × 2, а дальше домножим на общий знаменатель

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

        Посчитаем такие минимальные по модулю ua, ub и uc, что uaa + ubb + ucc (например, методом Крамера). Если |ua|, |ub| или |uc| ≥ n, то ответ равен n3, иначе n3 - (n - |ua|)(n - |ub|)(n - |uc|).

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

      Решение на O(N2log(N)) — перебираем все u и v от 1 до N. Для каждой такой пары смотрим, куда попадет вектор u * A + v * B. Очевидно, что точки в ответ будут выбираться из прямой, параллельной вектору С и проходящей через эту точку. Для некоторых различных пар (u, v) вектор u * A + v * B может попадать на одни и теже прямые, нам надо будет такие повторяющиеся прямые учесть. Простой способ найти повторяющиеся прямые — это запихнуть все в один массив и отсортировать по ключу, который уникально бы идентифицировал прямую. Из-за этой сортировки и всплывает логарифм.

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

    Еще и с запасом в 3 раза.

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

Contest for Red coders :( this round really contains very hard problemset

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

Такой вопрос: у меня во время контеста у решения, отправленного в открытую, был вердикт "Тесты из примеров пройдены", хотя в мониторе был +. После окончания контеста вердикт поменялся на "OK", как и для решений, отправленных в тёмную. Это нормальное поведение или баг?

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

увидел, что D в итоге самая лёгкая. как её просто решать? сам долго писал решение за nlog2n.

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

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

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

      Ах блин точно. Иногда лучше чуть подумать, а не писать бинпоиск с фенвиком :)

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

    сначала, понятно, найдем такое минимальное n, что n * (n — 1) / 2 >= k. все, теперь мы знаем длину перестановки. теперь она восстанавливается однозначно! пусть мы хотим поставить i-ое число от начала и нам осталось сделать cur инверсий(изначально cur = k). тогда с помощью оставшегося суффикса мы сможем сделать mx = x * (x — 1) / 2 инверсий(x = n — i)и получается нам надо поставить число, которое будет образовывать с суффиксом val = cur — mx инверсий, т.е. надо найти val-ое число по возрастанию из еще не поставленных. это можно сделать фенвиком, но я его не знаю и sqrt-декомпозицию написал. итого n * log(n) с фенвиком и n * sqrt(n) с декомпозицией

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

How to solve A???

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

    If you fix the first black vertex (closest to the central vertex from 1 end) in a cycle of c vertices, you can pack the next few black vertices in that cycle greedily; this way, you get the distance of the 2 black vertices closest to the central vertex equal to c%K + aK ≥ K (a: any non-negative integer such that the inequality holds).

    Consider a valid solution (not necessarily optimal) where the first black vertex is fixed at some distance d from the central one, and the last one (in that cycle) is at a distance d' such that |d - d'| > 1. You can rotate the black vertices by 1 now, in such a way that the respective distances are d + 1 and d' - 1 (or d - 1 and d' + 1), so |d - d'| decreases by 2 and increases by 1. This solution is also valid, so we can use this rotation and fix (integer division).

    This tightest greedy packing of black vertices makes all pairs of black vertices in 1 cycle satisfy the condition, and the smallest distance between 2 vertices from distinct cycles is the sum of 2 smallest -s. In case K is odd and there are x ≥ 2 cycles for which that number is (first division: integer, second: exact), we fail; otherwise, we win.

    If we fail, we need to increment a for at least x - 1 cycles; then, we get the situation with x ≤ 1, and win. So we just need to find the obvious greedy bound B on the number of black vertices, sum of (integer division, when taking each cycle independently), the number x of cycles for which and correct the bound B to B - (x - 1) (if x > 0). I hope it was at least a bit clear :D

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

For Problem D, I had the following idea, but had some problem while implementing:

Suppose we have sequence 1 2 3 4 5, then rotating the sequence would give 5 inversions -> 2 3 4 5 1 .

So I thought that I just had to calculate the amount by which a particular subsequence should be rotated to come closer and closer to K inversions.

e.g.:

For K=8,

Initially: 1 2 3 4 5

Step1:  K -  = 4 2 3 4 5 1

Step2:  K -  = 3 3 4 5 2 1

Step3:  K -  = 1 4 3 5 2 1

So the answer would be 4 3 5 2 1

Is my approach correct? How do I implement it? Or is there a simpler approach to go about it?

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

    The number of inversions in your answer is 7, not 8.

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

      Edited. Could you describe your method please?

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

        Let inv[n] = n*(n-1)/2. Find the smallest n, such that inv[n] >= k. The first number in permutation is k-inv[n-1]+1, the others should be put in the decreasing order.

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

По моим подсчетам топ 8 участников гарантировали себе выход на онсайт

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

How to solve B?

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится
    1. Note that a bigger module does not influence after a smaller one, or if an initial number is smaller.

    2. So we have a non-increasing subsequence, ending with the smallest number, and we can ignore other numbers.

    3. Sort the numbers and run by them in non-increasing order. Keep in used[] array the set of numbers we have. Initially this set is empty.

    4. At each step, take all the available numbers modulo a[i], add the results to the set and also add the number a[i] to the set (as an initial number).

    5. There are some tricks with the smallest number. It can be unique or not.

    6. The total time is O(largest number * N).

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

      Thanks. I used exactly the same approach, but failed on test 18 :( The "trap" was that if smallest number is present in the array more than once, we should not add it to the set on the last step.

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

I solved problem D, using Binary Search.

First I find what is length of permutation such that total numbers of inversion is closer to k using the binary search.**(No of inversion = n*(n — 1) / 2)** as maximum value of k can be 10^9 so I took upper limit as 10^5 + 1 and lower as 0(because 0 inversion 1 element at least). suppose we got length of permutation as length,inversion of this length as inversion Now I got length of permutation , so now I have to make this permutation so no of inversion should be equal to k. So inside while loop taking condition as while(inversion > k) do binary search on permutation from 1 to length such that (inversion — (length — (result after binary search)) >= k) Then I add it int array.Print it first and print the remaining one in decreasing order.

for example ;

k = 4

after binary search it will give length of permutation as 4(No of inversion is 6).

step 1 — 6 > 4 : after binary search on permutation from 1 to n we find that 2 is best because(6 — (4 — 2)) gives us 4 which is greater than equal to k.we add 2 in array. step 2 — 6==4: loops break;

print length; print elements added in array. print remaining element in decreasing order

so output

4 2 4 3 1

I got accepted in second time because I added wrong element.

My solution -

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

I solved problem D, using Binary Search. First I find what is length of permutation such that total numbers of inversion is closer to k using the binary search. ** (No of inversion = n * (n — 1) / 2) ** as maximum value of k can be 10 ^ 9 so I took upper limit as 10 ^ 5 + 1 and lower as 0.

Suppose we Got permutation of length as length , this length of inversion as inversion Now I Got length of permutation, so now I have to make this so no permutation of inversion Should be equal to K.

So inside while loop taking condition as while (inversion> k) do binary search on permutation from 1 to length such That (inversion — (length — (After Binary search result))> = K) Then I Add it int array.

Print it first and print the remaining one in decreasing order.

for example; k = 4 after binary search it will give length of permutation as 4 (No of inversion is 6).

step 1 -; 6> 4: after binary search on permutation from 1 to n we find that 2 is best because (6 — (4 -; 2)) gives us 4 which is greater than equal to k.we add 2 in array.

step 2 ; 6 == 4: loops break; print length; print elements added in array. print remaining element in decreasing order so output 4 2 4 3 1 I got accepted in second time because I added wrong element.

Edit- It got posted in Russian, so need to paste it again in english. My solution

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

А какое предполагалось решение в F?

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

    Видимо, предполагалось использовать фишку, что количество различных длин циклов в перестановке .

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

      Я написал решение, которое работает за количество различных длин циклов в кубе умножить на вычисление gcd и получил TL. Добавил запоминание в gcd для чисел меньше 1000 и получил ОК. Вот мне и стало интересно, действительно ли авторское решение такое же.

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

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

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

        Java? На С++ у меня такое решение без запоминания gcd работает 2.079; с запоминанием 0.797.

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

          Ну вот у меня на джаве где-то 5с -> 2c.

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

          Ну решения без запоминания тоже разные написать можно. Можно вычислять gcd 2 раза в самом внутреннем цикле, а также использовать при его подсчете long long. Это работает медленно, но еще может пройти. А можно написать его в интах и считать во внутреннем цикле только 1 раз. Такое проходит c хорошим запасом без всякого запоминания. В любом случае, даже первое решение заходит на Java, правда впритык.

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

            А ещё можно после объединения первых двух перестановок отсортировать список и пообъединять циклы одинаковой длины, и только потом объединять результат с третьей перестановкой.

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

Solution for problem E (user requested):

Suppose that there are two triples (ua, ub, uc) and (va, vb, vc) such that uaa + ubb + ucc = vaa + vbb + vcc. Then (ua - va, ub - vb, uc - vc) is an integer multiple of some fixed triple which could be found by solving a linear system. Let that triple be (da, db, dc). Suppose that da, db, and dc are nonnegative (actually, changing their sign doesn't affect the answer). From every triple (ua, ub, uc), where each of ua, ub, and uc is between 0 and N - 1, subtract (da, db, dc) while the result is still within those bounds. The final set will contain the points which have either ua < da, or ub < db, or uc < dc. The number of such points is N3 - (N - da)(N - db)(N - dc), and this is the answer. However, if either of da, db, or dc is at least N, the answer is just N3. Total complexity: O(1) (ignoring the GCD computation).

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

    I solved it in O(N2) by trying all ua - va, ub - vb, computing the necessary uc - vc for them and checking how many solutions they take out. A really simple solution. Pity that I didn't do this problem instead of F during the contest, I would've probably gotten a better place (at least thanks to time) :D

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

How to solve F? My idea was for each of the 3 permutaions, we can get cycle lengths of the permuations, and then we can take 3 cycles from 3 permutaions, and for all 3 cycle combination count how many coin it will take to visit all grids having co-ordinates in those 3 cycle combination, add these to get the result. But time complexity becomes O(N^3). How to do this?