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

Всем привет!

Уже в эту субботу состоится второй квалификационный раунд Russian Code Cup. На этот раз раунд будет в первой половине дня — он состоится 25 апреля в 12:00 по Москве. Раунд продлится 2 часа. По итогам раунда 200 лучших выйдут в отборочный раунд, где сразятся за выход в финал.

Те, кто после второго квалификационного раунда все еще не пройдут в отборочный раунд, смогут попробовать свои силы в третьем квалификационном раунде 31 мая в 13:00. В отборочный раунд, назначенный на 13:00 14 июня, пройдут 200 лучших участников из каждого квалификационного раунда.

Для того чтобы принять участие в Russian Code Cup, нужно зарегистрироваться на сайте http://russiancodecup.ru/ (регистрация будет открыта до начала третьего квалификационного раунда).

Подробнее о чемпионате, правилах и призах и читайте на сайте http://russiancodecup.ru, по всем вопросам обращайтесь на russiancodecup@corp.mail.ru

Приглашаем всех принять участие в квалификационном раунде Russian Code Cup и желаем всем удачи!

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

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

А почему так рано?! У многих сильных студентов в это время пары. Я думаю лучше на вечер перенести.

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

    У многих сильных студентов Чемпионат Урала :)

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

      Да! И еще чемпионат Урала. Короче самое неудобное время.

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

А можно участвовать неофициально, даже если прошел в отборочный тур?

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

Где можно сдать задачу?

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

    У меня такая же проблема, кажется, что если зарегистрироваться после начала тура, то в нём нельзя участвовать.

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

      Вчера нажал кнопку зарегистрироваться ((

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

Объясните кто-нибудь пожалуйста пример из задачи B. Как там получается 5.5, а не 5.0?

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

    (1,1) -> (2,1) -> (3,1) => 5 * 0,25
    (1,1) -> (2,1) -> (3,2) => 5 * 0,25
    (1,1) -> (2,2) -> (3,2) => 6 * 0,50

    В сумме 5,5

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

Как-то таблица результатов очень медленно обновляется.

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

А я вот залогиниться не могу. Но кнопку регистрации я нажимал ой-как-давно. Факт аутентификации теряется где-то между сайтом кубка и сайтом, кхм, "центральной системой регистрации" (кстати, зачем она вообще была нужна).

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

    Логиниться я правда начал где-то через полчаса после начала, my bad. Но это же не повод меня совсем не пускать:(

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

    Платформа codeforces действительно одна из лучших, если не самая лучшая. Но к желанию mail.ru проводить контесты на своей площадке я отношусь спокойно (google и yandex проводят же). Все было бы хорошо, если бы не этот ГИГАНТСКИЙ шрифт. Они считают программистов по умолчанию слепыми? Уменьшить масштаб не вариант, ибо при нормальном размере текста задач остальное становится слишком мелким и сбоку огромные пустые полосы. Смилуйтесь, если не хотите менять дизайн — сделайте условия в pdf на olymp.sty! С остальным сможно смириться, но не с необходимостью постоянно прокручивать и читать одно слово на весь экран.

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

      кстати для парсинга условий написал питон-скрипт
      для его работы нужно только менять айдишник раунда, сами знаете где его взять :)
      еще можно сохранять страницу с условием задачи локально и открывать (главное удалить папочку, оставить только html-файл). но да, это костыли...

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

      +1 весь этот дизайн сайта похож на типичный дешевый понт в исполнении mail.ru. Вместо дизайна лучше бы прочекали проблемы с GNU C++.

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

        Думаю, этим занимаются в лучшем случае знакомые друг с другом люди.

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

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

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

    А чего удалили? Интересно же, что заплюсовали. Или было много-много мата на дизайн сайта, судя по ответу?

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

      Было всего один мат и предложение ставить плюс, если не понимаете, почему контест на базе своей площадки с таким <мынщибеу< интерфейсом, а не на базе CF.

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

    Интересно, почему сила плюсомета не угасает даже с УДАЛЕНИЕМ комментария?

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

    Мой код, получивший WA1 на их сайте, зашел в тренировке с первой попытки.  ¯_(ツ)_/¯

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

      Выводить long double cout'ом — не очень хорошая идея

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

        Почему? Это какой-то особенный тип?

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

        Честно говоря, удивляет подход жюри, что здесь, что на NEERC. Еще в 2013-м году на NEERC участники напоролись на неадекватное поведение ввода-вывода вокруг long double. Прошел год, и на NEERC 2014 было опять то же самое — те же вопросы от участников, те же ответы жюри "да, не работает, выкручивайтесь". Хотя уже очень давно есть нормальные сборки mingw, на которых эта проблема не воспроизводится. Это же надо умудриться выбрать проблемную сборку и именно ей пользоваться (как минимум) полтора года? А ведь g++ это, наверное, самый популярный компилятор на контестах. Оба года на NEERC я подходил к Георгию Корнееву и обращал внимание на эту проблему с g++.

        На RCC ситуация усугубляется отсутствием в разделе правил точной версии (и даже платформы) используемых компиляторов http://www.russiancodecup.ru/rules/, отсутствием пробного тура, отсутствием функциональности типа <<запуск>> на Codeforces. Ну даже просто броадкаст от жюри со словами: "будьте аккуратны с выводом long double, рекомендуем ..." сильно улучшил бы ситуацию. А ведь еще, наверное, за WA/PE 1 штраф начисляется.

        ИМХО, очень такой расклад не participant-frendly и, что огорчает, тянется уже довольно долго.

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

          Это же надо умудриться выбрать проблемную сборку

          Чуть более точно: это сборка с названием наиболее похожим на "mingw", первая ссылка в гугле и тому подобное. Скажем, пока мне внезапно не захотелось 64-битный gcc на Windows пару месяцев назад, я даже и не подозревал, что бывают и другие сборки. MinGW и MinGW.

          отсутствием в разделе правил точной версии

          Почему же, всё есть: GNU C/C++/C++11 MinGW 4.8.1. Это очень точно характеризует версию, мне кажется. Есть ровно одна сборка с названием "mingw", остальные называются по-другому: tdm-gcc, win-builds, mingw-builds...

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

Как решать задачу B? Какая там динамика?

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

    Я делал рекурсию с мемоизацией. Логика простейшая:

        if (l < r)
            res = recurse(i + 1, j) + l;
        else if (r < l)
            res = recurse(i + 1, j + 1) + r;
        else
            res = 0.5 * (recurse(i + 1, j) + l) + 0.5 * (recurse(i + 1, j + 1) + r);
    
    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Я как-то то же самое сделал но у меня WA. Кто нибудь скажет почему. Вот код

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

        Возможно, я понимаю, почему так (но тогда ума не приложу, как решать задачу). Генератор:

        cout << "1\n1000\n";
        for (int i = 0; i < 1000; ++i) {
        	for (int j = 0; j < i + 1; ++j) {
        		cout << "1000000000 1000000000 ";
        	}
        	cout << endl;
        }
        
      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится +8 Проголосовать: не нравится

        if (a[i][j * 2 — 1] == a[i][j * 2]) А даблы так хорошо сравнивать?

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

          a[i][j * 2 — 1] и a[i][j * 2] даблы но в них хранятся инт. Обидное то, что то же самое решение что получил WA во время соревнования, прошло все тесты в разделе тренировки CF.

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

    Довольно простая, храним два массива prob[][], expected[][] — вероятность и мат. ожидание в какой то клетке.
    Код.

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

      Underflow не получается при n = 1000? У меня было вроде бы работающее решение, которое на сервере выдавало Presentation Error. Я спросил у администрации — как так, даже если решение неправильное, я в любом случае вывожу t чисел. Получил ответ — ваша программа выдает строку, которая не является вещественным числом.

      Я загрузился. Единственное объяснение, которое придумал — что-нибудь не так с арифметикой и где-то я получаю NaN или ещё какую-нибудь гадость. Начал думать, как всё это сделать в целых числах или в логарифмах. Так и не придумал.

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

        писали на питоне? Скорее всего там выводилось что-то типа "1.2345e-67", и достаточно было воспользоваться функцией format: "{:.7f}".format(1.2345e-67)

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

          Спасибо за помощь — нет, это был C++ и выводился через

          cout << fixed << setprecision(6) << value << "\n";

          Но чисто для справки — 1.2345e-67 это абсолютно нормальное вещественное число. Если бы оно вызвало ошибку я бы уже жаловался администрации.

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

            Тем не менее, NAN и всякие другие интересные значения вещественных типов выводятся — по мнению стандартных чекеров — не как числа. Пример:

            #include <cstring>
            #include <iomanip>
            #include <iostream>
            using namespace std;
            int main (void) {
            	long double x;
            	memset (&x, 255, sizeof (x));
            	cout << fixed << setprecision (10) << x << endl;
            	return 0;
            }
            

            Вывод: -1.#QNAN00000.

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

              NAN'ы согласен -на то они и NAN, Not A Number. А вот 1e-3 и 0.001 чекер должен воспринимать одинаково. Хотя никогда не пробовал, как это воспринимает чекер на Codeforces. Надо попробовать.

              Я так и не понял, в чём была проблема — так как код я дописывал в ходе контеста, у меня нет точной копии того, что я отправил. Может быть была на самом деле ошибка исполнения и вердикт Presentation Error был не совсем правилен.

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

    Для каждой комнаты динамикой считаем вероятность туда попасть и для каждого коридора, выходящего из этой комнаты, плюсуем к ответу его <длину> * <вероятность попасть в комнату, откуда выходим> * <вероятность пойти по этому корридору (0, 0.5 или 1)>

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

Я научился в Д считать первую степень всех чисел, а как надо было для произвольных степеней решать?

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

    Для первой степени оказывается не очень интересно

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

    1) Смотрим, что 10^9 + 23 = 3 * 121 * 61 * 45161.
    2) Для каждого из этих множителей находим период Пизано (период последовательности Фибоначчи по этому модулю). Считаем частичные суммы нужных нам степеней по этому модулю, а также сумму на всем периоде. По этим величинам нетрудно найти нужное нам значение по рассматриваемому множителю.
    3) Зная значение интересующей нашей величины по взаимно простым модулям, можно найти значение по модулю их произведения, используя китайскую теорему об остатках.

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

      Ну вот, по модулю 45161 я период не нашел (видимо где-то баг в коде) и ушел размышлять в другом направлении... Зато теперь я знаю, что эта штука называется период Пизано и для модуля m этот период всегда не больше 6m.

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

    Модуль составной, 45161 * 22143 (22143 тоже составное но не важно). Можно решить по каждому модулю отдельно и потом китайской теоремой об остатках соединить. По первому модулю последовательность ФФиббонначчи зацикливается после 45160 элементов, по второму вообще после 1320. Можно эти ~50000 предпосчитать и потом возвести все в степень К. Потому считаем сумму всех нужное число раз и ещё раз проходим чтобы посчитать сумму оставшегося куска.

    У меня с быстрым возведением в степень в long long не зашло (вообще достаточно int'а). Я ещё делал K %= phi(mod) но тут можно напороться на то, что если K = t * phi(mod) то не сработает для чисел, не взаимнопростых с mod, очень долго отлавливал этот кейс.

    (пример фейла: 6 = pow(3, 8, 15) ≠ pow(3, 0, 15) = 1. Тут phi(15) = 8.

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

      Если представить число 109 + 23 в виде 3 * 121 * 61 * 45161, то фейл может случиться в двух случаях:
      1) Основание степени равно нулю
      2) Модулю, по которому мы ищем степень, равен 121. Здесь для x = 11q получаем: xk ≡ 0, k ≥ 2

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

А как решать задачу C?

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

    У меня зашел бинпоиск. Зная радиус, проходимся по массиву и пытаемся жадно лезть к краю окружности, и проверям, что каждая палка влезает.

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

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

      Первую планка ограничивает минимальный радиус — меньше уже не получится. Каждую следующую мы укладываем как хорду (в пределах от 0 до 2R это можно сделать), таким образом наш конец последовательности всегда на окружности. Если натыкаемся на что-то больше 2R, то приходится увеличивать радиус до этой планки / 2 и продолжаем дальше.

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

        Вот это проходится? Ответы 5 и 5.5

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

          По-моему 4.5. Пошёл перечитывать условие.

          UPD: Понял, спасибо!

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

    У меня зашел какой то треш: http://pastebin.com/uv9DFf2J. Я использовал соображения, что либо ответ это максимальная палка делить на 2, либо есть какая-то палка, которую мы не успеем сделать диаметром, т.к. палки впереди нее не достают в сумме до окружности.

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

      Той частью, где треш ты, видимо, обрабатываешь случай с длинной первой палкой.) А все остальное нормально.

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

    В любом случае радиус будет не меньше первого отрезка. Дальше идем по всем палкам и стараемся самую длинную положить на диаметр. Она кладется, когда сумма всех предыдущих ей палок больше половины ее длинны. А все последующие палки будем укладывать так, чтобы обе точки лежали на окружности. Тогда на каждом ходу мы сможем положить палку, не меньшую текущего радиуса.

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

    Радиус не может быть меньше, чем:

    1. длина первой палочки;

    2. половина длины какой-либо палочки кроме первой;

    3. длина какой-то палочки минус сумма длин предыдущих палочек.

    1 и 2 — очевидно почему, 3 — нам нужно чтобы самая большая палочка стала диаметров окружности, а для этого нам нужно успеть прийти к этой окружности от центра.

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

Как решать D? Я разложил модуль на степени простых: 3, 61, 121, 45161, решил для каждого модуля в отдельности (по каждому множителю модуля там возникает период размером с этот множитель, и поэтому можно искать степени не до n, а до периода, а потом домножить на нужное число), потом скомбинировал ответы, и вот это получает TL.

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

    У меня пара оптимизаций для возведения в степень помогла. (На intах вместо long long, и K %= phi(mod)).

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

      Да, пожалуй, с этим все зайдет, я на 1:59:47 просто семплы прошел, оптимизить было некуда. Но все-таки неприятно когда такие оптимизации нужны, можно было бы сделать ограничения поменьше, и неверные решения все равно бы не заходили.

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

Неплохо было бы добавить просмотр кода своих посылок.

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

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

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      1. Правила тренировок Codeforces.
      2. Я спокойно это обошел с помощью тренерского аккаунта, а ты ведь можешь сделать тоже самое. Что остальным делать... даже не знаю.
  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится

    TL по D бы уменьшить... моё решение получало TL на RCC, здесь заходит за 2.2. Я бы поставил 2 секунды.

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

Забавно получилось. Пишу на С++ -- получаю ВА1. Переписываю на джаве -- получаю АС. И так с двумя задачами (вторая и третья).

В тренировку зашёл тот же самый код на С++ по обеим.

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

    Тоже получал на контесте только WA1 на GNU C++ по A, B и C.

    В тренировке те же, судя по времени редактирования, решения получают WA1 по A, (хотя локально ответы на выложенных тестах совпадают), TL10 по B и AC по С.

    Написал в форму обратной связи.

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

      Тоже проблема с вердиктами. WA1 по B на контесте, TL11 на тренировке. Нехорошо это, Особенно если учесть, что стандартные ускоряющие исправления: «cin на scanf» и «вектор на массив» запихивают задачу (на тренировке).

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

У меня одинаковий код для B на контесте выдавал WA6, а здесь получает AC. Как так?

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

TL10 на сервере Russian Code Cup и TL11 на Codeforses по B потому что:

double a[1111][1111][2];
....
cin >> a[i][j][k];

работает дольше, чем

double a[1111][1111][2];
....
int aa;
cin >> aa;
a[i][j][k] = aa;
»
10 лет назад, # |
  Проголосовать: нравится +24 Проголосовать: не нравится

Кстати, а у меня у одного в период где-то с 40.00 до 55.00 не засылались решения? Попробовал написать вопрос жюри, а вопросы тоже не отсылались)

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

У меня один и тот же код по задачам B и C получал WA1 на GNU C++ и Accepted на Visual C++. Может проблема в long double?

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

    Под наиболее дефолтной сборкой MinGW под винду вывод long double не работает никак вообще. Ни cout, ни printf("%lf") ни printf(не-знаю-что-еще). Потому что оно использует printf из вижаковской libmsvcrt, а там long double нет по каким-то очевидным причинам.

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

Просьба к организаторам добавить возможность просматривать/загружать посабмиченные во время соревнования решения, я такого не нашел.