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

В воскресенье, 3-го мая, в 19:00 начнётся Раунд 3 чемпионата по программированию VK Cup 2015! Не забудьте зарегистрировать вашу команду на раунд, регистрация закроется за пять минут до его старта.

В этом раунде могут принять участие все те команды, которые отобрались в Раунде 2 или в Уайлд-кард раунде 2. Напомним, что из второго раунда допущены все те команды, что набрали не менее 928 баллов. В уайлд-кард раунде 2 было достаточно набрать 1827 баллов. Таким образом, принять участие в Раунде 2 могут 100 + 20 = 120 команд!

Участников ждет соревнование по правилам классических раундов Codeforces. Раунд 3 пройдёт в таком же формате, как и Раунд 2 — с онлайн-трансляцией, рейтинговой и доступной только для див-1 участников. Будет использована плавная динамическая система оценки задач, но сами задачи будут расположены в случайном порядке. Участникам будет предложено 6 задач.

Раунд подготовлен силами команды Codeforces, команды VK и пользователя yeputons. Как всегда, неоценимую помощь в тестировании задач оказали winger и AlexFetisov.

Напомним, что в Финал VK Cup пройдут все те команды, которые наберут положительный балл, не меньший, чем у команды на 20-м месте. Также обращаем ваше внимание, что участники всех команд, прошедших в Раунд 3 (независимо от их участия или неучастия в Раунде 3 или в его трансляции), получат фирменную футболку Чемпионата. Помимо этого, фирменной футболкой будут награждены топ-50 участников интернет-трансляции Раунда 3.

Желаем удачи и интересной борьбы!

UPD1 Раунд 3 завершён! Поздравляем топ-20 команд, которые отправятся в июле на Финал VK Cup 2015! Следите за объявлениями на сайте, точная информация о финальном раунде появится позднее.

UPD2 Тем временем появился разбор.

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

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

It's look like everyone who is participate will get a t-shirt.

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

До начала раунда менее часа. Вот вам небольшой спойлер к одной из задач:

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

Not rated for div2? (Why negative upvotes?)

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

.

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

 Теперь должно быть "Зарегистрирован(а/ы)" :)

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

Некоторые участники совсем лишены чести и, не имея права участвовать в VK Cup из-за возрастных ограничений, все равно зарегистрировались и добрались до раунда 3. Очень некрасиво.

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

No you are wrong if you have the knowledge that participate in a competition which you want) How do you know 3 Raud passed only 100 strong teams — it's all cool if younger people were held in 3 round and fight for the finals Good luck to all participants VK Cup 2015 — Round 3 and VK Cup 2015 — Round 3 (unofficial. Webcast only Div. 1).

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

This contest is so hard with me.

I think I don't have enough knowledge to be Div1-contestants.

I hope I will become Expert to improve myself.

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

Hard contest!

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

Даёшь уайлд-кард 3!

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

I got too late to participate.. but Was problem C a binary search , bcz for all x >= k , idempotent condition is true ?

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

Мне показалось, или F оказалась легче, чем C?

Над С думал очень долго, писал три разных решения, в итоге 100 минут истратил.

F прочитал и понял за 7 минут, 10 минут придумывал решение, 6 минут писал его, 3 минуты искал баги, в итоге истратил 26 минут.

Хотя, возможно, я глупец и у меня всё упадёт.

UPD: С еще и упала, лол. Ну точно F — легче.

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

How to solve Problem C?

In this problem, I try the value of k from 1 to 100000 (I think it can run in 1s),

but it is Wrong Anser on test 9.

Can you give me effective hint?

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

    Hint: k can be larger than 100000, or 10^9 (I think).

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

    Hint: Maximum possible answer is around 10^14

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

      I wonder how did you find the maximum possible answer. May I ask you?

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

        In the graph with edges (i->f(i)) if we have a cycle of length K, then answer should be divisible by K (such that when we apply f^K(x), we get x, and f^K(f^K(x)) = x). Therefore, an obvious lower bound for the answer would be a set of cycles of different lengths. Answer would be their LCM. To maximize LCM, let's take prime numbers. We get something like 2 + 3 + 5 + ... + 37 or something, such that sum is less than 200 and product is maximized. This is around 10^14.

        And the true maximum possible answer is a division of 200 into a groups such that LCM of the sizes of these groups is maximized. This division includes not only primes but maybe some powers of primes. According to the editorial, there is a sequence which describes such maximum LCM and it is about 2 * 10^14 for 200, therefore my lower bound was pretty close.

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

    I tried 1 to 2500000! and got runtime error 8 times

    I think answer of test 9 is bigger than 2500000.

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

    The gist of the problem is to tranform it into one about graphs. We construct a graph with edges (i, f(i)), we see that f(x) is just the neighbor of node x, and fk(x) is the kth neighbor of node x. Now because every node has an outdegree of exactly one this graph can be decomposed into cycles or paths that lead to cycles. Now the condition fk(fk(x)) = fk(x) can be interpreted as the 2*kth neighbor of node x should equal it's kth neighbor. For nodes that are part of a cycle the answer is the a multiple of the length of the cycle(because k must satisfy the modular equation k ≡ 2 * k(mod length) which is equivalent to k ≡ 0(mod length)). So if there would be only cycles the answer would be the LCM of all the lengths of these cycles. Now what about paths? We notice that we need to pick a k such that it reaches a cycle, then for any K ≥ k we will just be walking through our cycle, so just take the length of the longest path to a cycle then pick a constant c such that c * lcm_of_cycles ≥ longest_path.

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

Will there be editorial?

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

yes... and there was the system test

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

А на чем все С ломали?

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

With 5 minutes to go I asked myself, what was I thinking? Faced with my strength, a graph problem, I instead tried to solve a maths question?? (I suck at maths questions :P)

Oh well, I thought, as long as A passes I'll get a shirt.

So you could imagine my disappointment when it failed TT

So you could imagine my shock at seeing my final rank: 50 !!!!!

Solved 2 problems in 33mins, it's currently 4:30am and I could have slept 2 hours ago. But who cares I get a VK shirt :D :D

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

54 место! Ну как так?! Совсем чуть-чуть не хватило :(

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

For C, how to prove that the answer will fit in long long ?

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

Как решать D?

Мне кажется что A = (p1k1 + 1) * (p2k2 + 1) * ... * (pnkn + 1), где p1, p2, ..., p3 — простые числа. Но у меня wa 25.

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

    Так и решать, только различные простые.

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

      Ну это понятно, а дальше как?

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

        dp[id_divisor][id_prime] — сколько способов представить divisor[id_divisor] в виде (pi1αj1 + 1)·... где максимальное p имеет индекс  ≤  id_prime (среди всех возможных p).

        Многие состояния недостижимы, поэтому лучше писать ленивую динамику, заходит за 150 мс.

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

    Да, нужно было найти количество решений уравнений (p1k1 + 1) * .. * (pss1 + 1) = A, где p1, p2, .., ps -  различные простые числа. Я написал перебор с некоторыми отсечениями и она прошла. Вот мой код 10987822

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

int dp[N][T] instead of int dp[T][N] => I simply lost the t-shirt.

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

Ребят, задача А — издевательство.

Как её адекватно реализовывать? А то у меня совсем треш вышел. 10989883

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

    Если кратко:

    Сканлайн. Для каждого второго отрезка пробуем его пересекать с первыми. Есть 3 типа пересечений — первый отрезок полностью включен, пересекает левую границу или еще не окончен. Для первого варианта — ДО на максимум, где храним Ф(левого конца) = длина отрезка. Для второго — ДО на максимум, где храним Ф(левого конца) = правый конец отрезка. Для третьего — храним сет ныне открытых отрезков, остортированный по левому концу.

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

      Ну у меня так же. Я про адекватную реализацию спросил...

      Btw, второй и третий вариант решается без структур простым преподсчётом максимумов/минимумов на префиксах/суффиксах.

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

        По-моему, вполне адекватно: два сета, одно ДО, никаких особых случаев, даже компаратор аккуратно писать не надо — события в одной точке не важно в каком порядке рассматривать (если при чтении выкинуть пустые отрезки).

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

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

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

    Переберём отрезок [ai, bi].

    1) Оптимальный ответ пересекает ai -- считаем максимальное r из тех, что начинаются раньше ai. Это пара циклов.

    2) Пересекает bi. Симметрично.

    3) Лежит внутри. Тогда сканлайн: пусть стоим в каком-то bi. Нас интересует максимальная длина отрезка, который начался после ai (то, что он уже закончился выражается в том, мы добавляем [li, ri] в точке его конца). Это дерево отрезков для максимума.

    Вроде неадекватной реализации нет.

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

    Я убрал все рекламные ролики, чьё окно времени полностью входит в окно какого-то другого ролика. Тогда оставшиеся ролики сортируются одновременно и по левому краю, и по правому. Дальше я прохожу по каналам и для каждого нахожу бинарным поиском последний ролик, пересекающий левую границу предоставляемого каналом окна (то есть заканчивающийся позже её) и первый ролик, пересекающий правую границу (то есть начинающийся раньше её). Можно или взять этот, или взять тот, или взять самый длинный ролик на отрезке между ними (range minimum query, который можно реализовать тысячей способов).

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

How to solve problem F? Is it some sort of 0-1 knapsack?

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

Hard contest + Small number of participants => low rating change.

Me with 1 solved problem have a close rank with someone who didn't solve any.

I suggest count someone participated in contest if he/she see a problem not if he/she tried to solve any.

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

Was anyone able to solve problem B in O(n2) at least?

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

    I think so. Let's sort ducks by their tails positions. For each duck, let's calculate the answer ignoring ducks with tails behind this duck's tail. Assume that this duck ends at t. I claim that we will ignore this duck, or shoot at non empty prefix of sequence: t, t - r, t - 2r, ... We can check all meaningful prefixes by iterating over previous ducks.

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

      So, are you doing some kind of DP? What about big coordinates? This sequence can be pretty long.

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

        I check two possibilities: 1. There will be no other shots (iterate over all ducks to check this) 2. I will shoot at some previous duck's tail, so I shoot as many as I can, while still being able to shoot that duck's tail. (iterate over all ducks in reverse order).

        Edit: Now I think I should also consider the sequence in the other direction t, t + r, t + 2r, ...

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

Is there a nice way to solve problem D?

My solution (which I debugged 2 minutes after contest) goes as follows: We have to count number of representations of the form A = (1 + p1a1)... (1 + pkak)

We call a prime p < sqrt(A) bad if there is a k such that 1 + pk|A.

We use dp[divisorsOfA][badPrimes].

dp[d][k] is number of representations of d as product of 1 + piai where pi is one of the first k bad primes.

One can easily write formula for dp[d][k].
Answer is dp[A][nrBadPrimes].

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

I think I'm Loser of the match :(

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

Hey, can someone who solved D take a look at this submission — http://mirror.codeforces.com/contest/542/submission/10991347

I seem to be doing the same DP as in reference solution, but it's working around 3 seconds on the worst test case, and I don't know how to bring it down. During the contest I had the same solution with a map for storing dp states, but switching to unordered_map didn't help.

Specifically, can you take a look at the go() function. I left the comments on top of it to explain stuff. When the first call is made, I still have around 1.3 seconds to figure out the answer, but DP with 14M ops is working much slower. Let me know if you figure out the problem.

Thanks!

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

I attempted A first because I'm familiar with data structure problems. So I solved other problems very late. One step of my algorithm in A is to iterate the ads in decreasing order of their ending time. So I wrote:

bool cmp(rec a, rec b){
	return a.r > b.r;
}

Looks alright. Huh? But the bad thing was that I iterated the ads from n — 1 to 0 instead of from 0 to n — 1. This is why I lost my T-shirt. And luckily now I have the same rating as dreamoon_love_AA.

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

In problem E, is there a better solution than n times BFS?

I mean solution like this:

1) check bipartity (our graph have to be bipartite)

2) In every connected component find longest path

3) The answer is sum of longest paths in every component

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

Still waiting for editorial...

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

My first time to become an IGM. Yay

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

Has anyone received the T-shirt yet?

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

Будет ли интернет-трансляция финала?