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

Всем привет!

Уже совсем скоро, в это воскресенье, 2 апреля в 19-00 по московскому времени состоится первый квалификационный раунд Russian Code Cup 2017. Лучшие 200 участников попадут в отборочный раунд, а остальные смогут попытать свои силы еще 2 раза, во втором и третьем квалификационных раундах.

Мы приготовили для вас небольшие новинки: в список языков на раунде будут добавлены Kotlin, Haskell и Free Pascal, а в список интерпретаторов языка Python — интерпретатор PyPy. Точные версии компиляторов и строки компиляции опубликованы в правилах олимпиады на сайте. Мы также работаем над добавлением новых языков в дальнейших раундах.

Желаем всем удачи на раунде и ждем на http://russiancodecup.ru!

UPD Выложен разбор задач

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

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

Hope, checking won't last as long as in warm-up.

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

Хорошо, что работают над добавлением новых языков. А что по поводу тестирующей системы и очереди в полчаса?

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

Will there be a mirror contest on Codeforces ?

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

    Why do you need a mirror contest? Everyone can participate in the official contest.

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

freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);

#endif

доступно там?

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

Hello, I see "Qual" word and green tick front of my name in results of warm-up round:

Capture

What does it mean? Am I qualified for elimination round?

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

Может кто-нибудь задачи скинуть?)

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

Как решить B ?? почему жадный алгоритм не сработает?

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

    Жадный это выбирать mex? Ну, это не работает на таком тесте:

    • 3 3 3
    • 1 1 1
    • 1 1 1
    • 1 1 1

    Ответ

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

      Спасибо, понял. Незнаете, а как решить, тогда?

      Upd: Теперь понял и решение. Не думал так просто:

      // for YES:
      for(int i = 0; i < n; ++i)for(int j = 0; j<m;++j){
         int x = a[i][j] ? 1 + ( j + i)%ncolor  : 0;
         cout << x << ' ';
      }
      
»
8 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

как решить С?

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

How to solve E?

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

    The answer is the number of different prefixes times the number of different suffixes in the range minus the sum over all letters of the number of prefixes that end with the given letter times the number of suffixes that have this letter before them in some string (basically, what we do is counting everything, possibly twice, and then subtracting strings that were considered twice).

    Now we need to count the number of different prefixes and suffixes in a range. If we use hashes, it's just a number of different integers in a range. We can compute it using a sweep line with a binary index tree (we also need to keep a binary index tree for each letter in the alphabet to do the subtractions).

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

      We don't really need hashes. Just construct a trie and assign different integers to different nodes.

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

Задача С — это игра "угадай компаратор для сортировки". Я угадал с 7 раза, но доказать не могу, почему он работает.

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

    и какой он? я пробовал только самый простой x/a>v.x/v.a

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

      Я вроде как даже доказал, что (a[i] — b[i]) * p[j] < (a[j] — b[j]) * p[i] но что-то не зашло. Какой правильный?

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

      У меня такой

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      bool cmp(pii x, pii y)
      {
          if (x.X*y.Y < x.Y*y.X) return true;
          if (x.X*y.Y > x.Y*y.X) return false;
          return (x.Y > y.Y);
      }
      

      x.X(x.first) — a[i]-b[i]

      x.Y(x.second) — p[i]

      pii — pair<int,int>

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +25 Проголосовать: не нравится
    inline bool cmp(int i, int j)
    {
    	return (a[i] - b[i]) * x[j] < (a[j] - b[j])  * x[i];
    }
    

    Почему это не работает?

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

      еще влияют уровни, которые между двумя рассматриваемыми

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

      Нужно убрать те, где x[i]==a[i]-b[i]==0. Они всему равны и портят компаратор.

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

        Я проверил глазами, что в этом случае пофиг, а в других все должно быть нормально, а стресс этот тест не поймал. Почему-то мне казалось, что в выпуклой оболочке я делал так же.)

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

        Вот это жесть :-( С 25й минуты до конца контеста пытался понять в чём дело (стресс проходило). Уже даже начал думать, что это из-за вывода long double (раньше на RCC проблемы были с ними).

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

    я с 3ей попытки угадал:)

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

    Зачем угадывать, компаратор это решение задачи при n=2.

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

How to solve C?

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

    Optimal order is found by sorting according to the following comparator: (a[i] — b[i]) / x[i]. Then one can do simple DP to find value of savings by using this order.

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

      Been there, done that, gottten WA xD.

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

        Here is my code, it worked for me, hope this is helpful, link:

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

        it was because of precision. I also got WA, but then I did just one division by 1e7 at the end and got AC

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

        The case where a[i] = b[i] or x[i] = 0 can be tricky. I handled them separately.

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

          Yes, you're right. I thought my code worked in that case but now I see that I was wrong. Thanks!

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

      With this method I was getting TLE on test 4. Any optimization in implementation? My code

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

        Well just to double check the sorting part just takes nlog(n). Then the dp for me is two dimensions of size n and 2, and constant amount of transition states. Thus nlog(n) + 2n should work in time I believe, constants are not bad I think?

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

        Can anyone please give working C++ code?

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

        Your comparing function can return x<y and y<x for some triples x,y (e.g. both having a=b) and the sorting enters infinite loop.

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

          ohh Thanks! I removed those two lines, but now it started giving WA in test case 3.

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

            For any x!=y you need the function to return true exactly once for x<y and y<x. Without these two lines it may return false twice if d1=d2. I usually return lexicographical order in such cases like your d1=d2.

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

              But if I have d1 = d2. Then it is like I am assuming x = y. So in that case shouldn't it be alright to return false both the times?

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

                No. You can return twice false only for exactly the same elements. Think of it in the way: would a correct sorting of [x, y] be [x, x]? If not, then you can't treat them as equal. And that's the case here.

                You can check out c++ strict weak ordering for more information about comparators.

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

                  Thanks again! I understood what was the problem. It worked after removing this ambiguity.

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

Я правильно понял, что задача В — раскраска графа в к цветов, что является NP-полной задачей... как ее тут решать?

В задаче С, у меня зашло такое решение:

1) Сортим все уровни по компаратору

	inline bool operator() (const ALL& v1, const ALL v2)
	{
		LL score1 = (v1.a + v2.b) * v1.p + (v1.a + v2.a) * v2.p;
		LL score2 = (v1.b + v2.a) * v2.p + (v1.a + v2.a) * v1.p;

		if (score1 != score2)
			return score1 < score2;

		return v1.a - v1.b < v2.a - v2.b;
	}

2) Просто идем по отрсортированным уровня и подсчитываем ответ.

Мне кажется, что это не правильное решение, но тесты прошло:)

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

    откуда такой компаратор? в задаче В можно заранее записать табличку вида
    1 2 3 1 2 3
    2 3 1 2 3 1
    3 2 1 3 2 1
    ... зависит от k. выписал для k=3. Ответ не существует, если есть полоса длиной больше k. Иначе просто выводим те элементы, где стоит 1.

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

      А разве в этом примере будет правильный ответ на задачу? Example: 1 2 3 0 0 0 2 3 1 0 0 0 3 2 1 0 0 0

      Во втором столбце два раза встречается цифра 2 и в третьем цифра 1, а так нельзя.

      Я думаю, что нужна вот такая таблица:

      1 2 3 1 2 3 2 3 1 2 3 1 3 1 2 3 1 2

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

        опечатка) конечно, верная таблица такая
        1 2 3 1 2 3
        2 3 1 2 3 1
        3 1 2 3 1 2

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

    Давай посчитаем длину максимального блока. Если она больше количества цветов — ответа нет. Иначе дадим каждой не лампе цвет (i+j)%k.

    Тут граф очень особенный, поэтому задача вполне себе решаема

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

      спасибо:) действительно — очень просто:)

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

    На контестах зачастую появляются NP-полные задачи в некоторых частных случаях и постановках, которые вполне себе разрешимы, так что ничего удивительного вроде :)

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

How to solve D?

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

How to solve D?

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

    for each index find out how far you can go while having K distinct elements , now do dp with segtree

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

      We can actually keep a multiset of available transitions to avoid using any custom data structures.

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

How to solve F?

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

How to solve B?

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

    Check if there exists continuous vertical or horizontal segment of tiles of size more than k. If so, print 'NO', otherwise print 'YES' and ((i + j) % k) + 1 on places where tiles are. (You can check that this answer satisfies the statement).

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

      why ((i + j) % k) + 1 works ?

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

        In the case when answer is "YES" we know that all the segments have length < k. Consider any such segment. Assume that the segment is horizontal. Same argument will work when it is vertical. For this horizontal segment i is constant. So in (i+j)%k will be different for each of those tiles in the segment. As we are incrementing it by 1 modulo k each time while moving along the segment.

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

Кто знает, можно ли эти задачи послать на дорешивание?

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

I wasted more than 1 hour on problem B misunderstanding the definition of "continuous segments of tiles." Please make problem statements clearer next time.

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

Does anyone know where can I submit solution after the contest is over?

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

А как нужно было понять, что в D правильное понимание условия именно такое? Я решил, что нужно более сильное условие для перехода, а точнее, что мы не можем не пропустить ход, если у нас уже есть нужные индексы.

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

    Если честно, то ты прав.

    Петин менеджер умеет мгновенно выдавать данные из любого числа блоков, если на каждый из них указывает хотя бы один указатель. Если же это не так, менеджер сначала переставляет указатели, чтобы условие выполнялось, а затем выдает данные — время выполнения этой операции для i-го запроса составляет si миллисекунд, можно переставить любое число указателей.

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

    Во втором тесте Пете невыгодно выполнять первые два запроса мгновенно (ставя изначально указатели на блоки 1, 2 и 4), потому что потом ему придется потратить 10 миллисекунд, чтобы поставить указатели на другие блоки. Поэтому оптимальная стратегия для Пети — изначально поставить указатели на блоки 1, 2 и 3, перед вторым запросом на блоки 1, 3, 4 за s2 = 1 миллисекунду, а перед последним запросом поставить указатели на блоки 1, 3 и 5 за s4 = 3 миллисекунды. Итого суммарное время ответа на запросы s2 + s4 = 4 миллисекунды.

    Это косяк условия.

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

First Qualification round has been added to gyms: 2017 Russian Code Cup (RCC 17), 1st qualification round

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

Первый квалификационный раунд добавлен в тренировки: 2017 Russian Code Cup (RCC 17), 1-й квалификационный раунд

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

Объясните, пожалуйста, для чего эта система с множеством тестов в одном тесте? Я получил WA2 по задаче B, в тесте 2 860+ тестов. Т.е. чтобы найти ошибку, мне нужно написать чекер ответов. При этом сравнение решений (моего и эталонного) ничем не помогло — я решаю точно так же.

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

Я забыл зарегаться до начала. Зайдя в систему и ужаснвушисть, я всё-таки смог зарегаться, но оно всё-равно отказывалось давать мне посылать решения. Кстати, хочу заметить, что вообще говоря такое поведение противоречит правилам.

Во-первых, в разделе "Правила чемпионата" ничего не написано про то, что участник должен быть зарегистрирован до начала раунда.

Во-вторых в более полных правилах есть два релевантных утверждения:

Регистрация Участников конкурса на контест проводится с 00 часов 00 минут 1 марта
2017 года до 19 часов 00 минут 29 апреля 2014 года включительно.

и

Регистрация на время проведения квалификационных раундов приостанавливается

Из первого утверждения можно заключить, что время в головах юристов мейл.ру течёт назад. Из второго утверждения следует, что вообще говоря не должен был бы смочь зарегистрироваться во время раунда. Однако, зарегистрироваться мне удалось, и согласно этим правилам, я должен был получить статус Участника.

Ах, да, обычно в правилах написано, что все участники отказываются от всех претензий к организаторам, тут как-то этого нигде нет. Опрометчиво, опрометчиво...

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

    Регистрация на раунд закрывается, как только начинается сам раунд. Вы зарегистрировались на второй квал (в профиле рядом с кнопкой "Да, я участвую" всегда пишется ближайший открытый квал). Спасибо, что указали на опечатку в правилах, конечно мы её исправим и постараемся сделать процесс регистрации на раунды более очевидным. Пункт про отказ от претензий добавлять всё же не будем :)

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

      Ну вот с Codeforces и TopCoder примерно понятно — им нужно честно распределять участников по комнатам. А для ACM-cистемы зачем вообще эта предварительная регистрация?

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

I downloaded tests, but in russian-code-cup-2017-qual1/b/tests I can onlu see files named "01", "01.a", "02", "02.a",... How can I see the tests? I am using OS X

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

    That's it. Just open that files in any text editor. There are few files, but each contains a lot of internal tests. *.a files are expected answers. Btw, your answers for B can be different, that in .a files, but also correct, because there can be more than one correct answer.