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

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

UPD Приём заявок завершён. С момента публикации статьи к проекту присоединились более 150 участников. Если кто-то подавал заявку по почте и не получил ответ — свяжитесь со мной через личные сообщения codeforces.

Вы всё ещё в div2, но мечтаете попасть в div1? Учёба занимает много времени, и олимпиадные задачи получается решать редко? Чувствуете, что постоянно решаете простые задачи, но никак не продвигаетесь к решению сложных?

Если Вы ответили “Да” на любой из этих вопросов, и хотите изменить текущую ситуацию, тогда эта статья для Вас!

Прочитав её, Вы узнаете

  • какие особенности человеческой психики можно использовать для оптимизации процесса тренировок;

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

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

Знакомая ситуация сразу после олимпиады: эх, опять готовился к олимпиаде только последние 3 дня, а вот если бы весь год перед этим готовился — точно бы прошёл на Всерос.

Как же осуществить мечту о тренировках круглый год?

Можно использовать следующие особенности человеческой психологии:

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

 2. Человек может неограниченно откладывать какое-то дело, если это дело можно выполнить когда угодно. А если есть фиксированное время, к которому нужно выполнить это дело, то мотивация существенно повышается при приближении этого времени. Вспомните хотя бы последние дни подготовки перед олимпиадой. ;-)

 3. Легко не выполнить данные себе обязательства (например, регулярно решать задачи), если об этих обязательствах известно только Вам. Но если кто-то другой в курсе этих обязательств, то отказаться от них становится сложнее. Значительно возрастает мотивация выполнить задуманное, а не остановиться на полпути, впустую потеряв много сил и времени.

 4. Когда параллельно тренируются несколько человек, возникает дух соревнования, что также повышает мотивацию решить задачу.

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

Раз в 2 дня даётся задача для решения, по окончании отведённого срока производится разбор этой задачи и выдаётся новая задача для решения.

Разбор происходит в виде видеоконференции. Часть участников участвуют в звонке, часть смотрит трансляцию. Архив записей разборов доступен всем участникам тренировок. После разбора вопросы по задачам можно задавать в комментариях к видео.

Тренировки в таком формате начались 28.10.2014, и на момент написания статьи (25.03.2015) разборы проводились 75 раз, каждые 2 дня в 22:00 без единого пропуска. Продолжительность разборов составляет от 10 минут до 1.5 часов, в последнее время типичное время разбора 20 минут.

До сих пор разбор проводил я, Меньшиков Фёдор Владимирович, в будущем возможно приглашение других экспертов для разбора конкретных задач.

До сих пор задачи брались с сайта acmp.ru, в будущем возможно использование задач с других сайтов, особенно для тем, недостаточно представленных на acmp.

Обычно разбор сопровождается написанием (и отладкой в случае необходимости) полного решения задачи. Большинство решений написано на C++, пара решений написана на Java для демонстрации подводных камней языка и библиотеки.

На текущий момент в тренировках принимают участие вологодские школьники, студенты и преподаватели.

Что даёт такой формат тренировок? Ответим на этот вопрос по пунктам, обозначенным выше.

 1. На каждые 2 дня даётся только 1 задача, типичному участнику тренировок эту задачу вполне по силам решить за час или меньше, и они это знают по опыту решения предыдущих задач, поэтому легче выделить время и приступить к решению задачи.

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

 3. Если Вы участвуете в тренировках, и уже сдали какие-то задачи, то коллеги по тренировкам это видят. И что Вы очередную задачу даже не пытались сдавать, они тоже увидят. В таких условиях труднее пропустить задачу, когда “нет настроя решать”.

 4. В тренировках участвуют несколько человек, возникает дух соревнования, и каждому хочется самостоятельно решить максимум задач. Фактически, участники тренировок получают 183 “олимпиады” в год.

Кроме того, у этих тренировок есть следующие плюсы:

 5. Сложность задач постепенно возрастает. Это означает, что участники со временем приобретают навыки решения всё более сложных задач. Текущий цикл увеличения сложности планируется продолжать ещё минимум полтора года.

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

 7. Во время разбора используются различные возможности языка и стандартной библиотеки, так что участники, знающие только основы языка, могут узнать о каких-то новых полезных возможностях и более простых реализациях.

Кто может получить максимальную пользу от таких тренировок:

  • Человек, уже обладающий базовыми знаниями языка (массивы, строки, вложенные циклы). Если Вы можете решить задачу 109 acmp.ru не более чем за день, то Ваш уровень достаточен.

  • Участник div2. Для участников div1 на codeforces большинство разбираемых в текущее время (март 2015) задач будут достаточно простыми. Задачи, интересные участникам div1, ожидаются примерно через полгода.

Если Вас заинтересовали эти тренировки, Вы можете принять в них участие. Для этого Вам необходимо написать на mfv@mail.ru о своём желании присоединиться к проекту, указав адрес своего аккаунта на acmp.ru с решённой задачей 109.

Присоединяйтесь, тренируйтесь и добивайтесь успехов! Это бесплатно. ;-)

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

Если Вы чувствуете, что эти тренировки могут привнести реальные улучшения в процесс Вашей подготовки к олимпиадам и помочь Вам добиться успеха, тогда сейчас самое время присоединиться к ним!

Чтобы облегчить процесс принятия решения, я воспользуюсь принципом 2 из этой статьи и зафиксирую время, до которого можно присоединиться к тренировкам. Присоединиться к ним можно будет или до 5 апреля, или после 1 июня 2015 года. Связано это с тем, что 19 марта начался цикл задач на динамическое программирование, и пока там задачи довольно простые, но их сложность будет неуклонно возрастать в течение пары месяцев, так что присоединиться в середине этого цикла будет сложно. Чтобы успешно присоединиться в середине цикла, нужно будет иметь уже значительный уровень или для набора необходимого уровня потребуется решать задачи этого цикла сначала, что перечеркнёт плюсы, описанные в этой статье.

Итак, жду Вашего письма на mfv@mail.ru.

Об авторе

Меньшиков Фёдор Владимирович:

  • автор книги “Олимпиадные задачи по программированию”,

  • участник финала студенческого чемпионата мира по программированию 2003,

  • тренер порядка десяти победителей и призёров заключительных этапов Всероссийской олимпиады школьников по информатике и ВКОШП.

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

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

Ценно! Хотя это, скорее, указания по ведению доп. занятий, а не переходу в div1. Но Вы определенно верно выбрали заголовок, этот пост просто обречен на прочтение)

Жаль, что мне до изложенных правил пришлось доходить самостоятельно. Хотя письменное пояснение преимуществ полезно даже для меня, я так еще не делал.

Кстати, спасибо еще раз за книгу! Ее содержание помогало учиться, структура — организовываться. Ее материалы, кстати, могут быть использованы для самостоятельных занятий по описанной здесь схеме, если разбить задачи не по "тренировкам", а, например, "неделям", располагая рядом задачи на одну тему в порядке возрастания номера. Увеличу связность Интернета — link, надеюсь, не будете против.

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

    Спасибо за позитивный отзыв! :-)

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

    Что касается книги, то у неё есть только одно ограничение — там всего 90 задач. А в этом проекте ожидается 183 задачи в год, и длительность проекта не менее 2 лет.

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

Есть пара вопросов:

  1. Как вы изначально заманиваете студентов/школьников участвовать во всём этом?
  2. Какая часть участников забросила тренировки?
  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +17 Проголосовать: не нравится
    1. Просто предложением участвовать. Никаких других плюшек не предусмотрено.
    2. Из тех, кто одно время реально сдавал задачи — около половины.
    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится +12 Проголосовать: не нравится

      Дополнение по пункту 2. Это же циклический процесс. Если человек забрасывает тренировки и не решает ничего, при этом участвуя в олимпиадах пару раз в год — то как правило такой человек всё равно возвращается к тренировкам после того, как на очередном соревновании существенно уступает тем, кто тренировался.

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

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

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

Добрый день.

Разрешите поинтересоваться относительно этих тренировок. На acmp.ru единственно доступный компилятор C++ это «Microsoft Visual C++ 7.1» и это просто ЖУТЬ нереальная. Потому что Это не то что C++11 или C++14 не переваривает: это нечто (я не могу это назвать компилятором) переваривает C++03 и даже C++98 как-то странно до ужаса, едва-едва поддерживая лишь совсем базовые конструкции.

Тренировки будут исключительно на acmp.ru проводиться, по крайней мере ближайшее время?

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

    Добрый день.

    По моим впечатлениям Visual C++ 7.1 поддерживает C++98 в полном объёме. Если я не ошибаюсь, это часть Visual Studio 2003, а в 2003 уже 5 лет как был принят Стандарт, и компилятору Microsoft неприлично было в то время не поддерживать каких-то из его свойств.

    Да, C++11 на acmp на текущий момент использовать нельзя. Как и Java 7. Но это самая маленькая из проблем, с которыми встречаешься на этом сайте. Самая большая на мой взгляд проблема — это слабые тесты на некоторых (не всех!) задачах. Вторая по величине проблема — наличие нескольких разных по скорости компьютеров, осуществляющих проверку, так что неэффективное решение на некоторых из них может пройти.

    Если всё так ужасно, то почему я использую этот сайт? А потому, что все эти минусы с лихвой компенсируются одним огромным плюсом: там есть много простых осмысленных задач и очень плавный переход от простых задач к сложным.

    В ближайшие полгода тренировки планируется проводить исключительно на acmp.ru.

    • »
      »
      »
      10 лет назад, # ^ |
      Rev. 6   Проголосовать: нравится +8 Проголосовать: не нравится
      Если я не ошибаюсь, это часть Visual Studio 2003, а в 2003 уже 5 лет как был принят Стандарт, и компилятору Microsoft неприлично было в то время не поддерживать каких-то из его свойств.
      

      К сожалению если верить многочисленным постам в интернете — даже версия студии 2005ая не поддерживает полностью стандарт С++98

      Один из хороших примеров такого поста — http://atarasevich.blogspot.nl/2008/02/microsoft-vs2005-c-non-compliance.html

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

    а можно пример этой "жути"?

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      #include <iostream>
      ...
      string s;
      cout << s << endl; 
      

      Мне не известен ни один другой компилятор, который переваривает string s; но не переваривает cout << s; фикс заключается в добавлении #include <string>

      А вот это i = 7 не должно работать ни при каких обстоятельствах, но компилируется и работает.

      for (int i = 0; i < 5; ++i) { ... }
      i = 7; 
      

      Это мелочи, но очень неприятные. Потому что их много и они всплывают всегда из ниоткуда. Да, это делает бинарник, работает, я получил акцепт по обозначенной задачи после 4 CE и одного WA (мой косяк)... Но надо плясать и танцевать, чтобы работало.

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

        Чтобы использовать string нужно подключить файл string. Неожиданно, правда? То, что другие компиляторы автоматически подключают этот файл при подключении iostream — их личное дело, стандарт этого не требует. Я бы не назвал ацмпшный компилятор жутким, он просто очень древний, но это почти не мешает сдавать на нём задачи.

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

          Да канешн, можно и на брейнфаке сдать много задач. Я и не говорю, что это невозможно.

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

            Не утрируйте. Между "компилятором с++, который не поддерживает с++11" и "эзотерическим языком, созданным, чтобы поржать" есть большая разница. Просто мне, как и oversolver, стало интересно, чего же вам такого потребовалось от с++03, что не поддерживалось бы в VS 2003. Первый ваш пример вообще неверен, второй — странен. Я про этот баг узнал только со странички Known Issues на MSDN. Как вы на него наткнулись и как он вам помешал?

            UPD Касательно второго примера: это не баг, а фича. Более строго выражаясь: это расширение языка. Это когда какая-то конструкция компилируется так, как это хочется разработчикам компилятора, хотя по стандарту вообще не должна компилироваться. Этим обожают заниматься все разработчики компиляторов с++. Подобное самоуправство отрубается флагом /Za (если вы хотите отключить все расширения) либо флагом /Zc:forScope (если хотите отключить конкретно это). В новых студиях этот флаг включен по умолчанию. Короче говоря, оба ваших примера неудачны.

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

              второй пример: у меня однажды был кода вида

              int index = m;
              // сильно ниже
              for (int index = 0; index < n; ++index) { ... }
              // и ещё дальше
              while (index != 0) { ... }
              

              и всё это сильно завязано на происходящее вокруг

              Этот код дурно пахнет, но он был. и однажды я в результате какого-то рефакторинга удалил строку int index = m; и очень сильно расстраивался когда видел непонятные вещи, а иногда не видел (в зависимости от того, когда n и m не совпадали) и убил на это ооооочень много времени. Любой другой компилятор указал бы на CE.

              А первый пример да, некорректный код, но это не оправдывает компилятор: сообщение о ошибке вообще не о том.

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

                Давайте еще раз: в первом примере компилятор ведет себя строго в соответствии со стандартом. И сообщение об ошибке он выдает правильное: "не найдена перегрузка оператора '<<', принимающая std::string". Вы сами виноваты в том, что вы не подключили файл, в котором эта перегрузка находится.

                Во втором примере я так и не понял вашей проблемы. Вы пишете прямо на VS 2003 что ли? Ну тогда вы сами себе проблемы устроили. Уже в VS 2005 поведение по умолчанию было изменено на желаемое вами. Лично я всегда пишу в последней студии, и у меня всегда всё спокойно компилируется на acmp на их древнем компиляторе. Просто приходится помнить, что нельзя использовать с++11. Вот это действительно раздражает, не то что ваши полумифические несовместимости ацмпшной студии со стандартом. Я их и знаю-то только потому, что искал возможности большего сокращения кода.

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

        Если эти два примера — это всё, что Вас смущает, то у меня есть для Вас решение. И я сам им пользуюсь, правда, не ради этого решения, а из соображений лицензионной чистоты.

        Решением является использование у себя дома компилятора Visual Studio 2008 Express.

        2008-я версия ровно так же не компилирует cin >> s, если нет <string>.

        2008-я версия выдаёт ошибку компиляции при использовании переменной цикла после цикла.

        По поводу лицензионной чистоты: 2008 Express бесплатная в отличие от 7.1.

        Сейчас на официальном сайте Microsoft нельзя скачать 2008 Express, поэтому у Вас есть 2 пути:

        • либо взять какой-то новый Express и попробовать найти, где там галочка использования фич только C++98

        • либо попросить у меня ссылку на образ 2008 Express — я могу поделиться.

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

    acmp.ru обновили. - Компилятор GNU C++ 4.9.2 - Добавлено язык програмирования Python - Добавлено язык програмирования C#

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

На e-olimp проводились соревнования "Пятерка за неделю". Их было полезно порешать не только представителям div2. Как Вы оцениваете сложность Ваших тренировок? Способы оценки предлагаю выбрать самостоятельно (например, рейтинг на кф / рейтинг на тс / уровень знания алгоритмов / средний уровень олимпиады школьников по информатике / средний уровень ACM ICPC)

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

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

    Ответ содержится в заголовке статьи. На текущий момент сложность задач соответствует тому, чтобы быть полезной представителям div2. Допускаю, что отдельные задачи могут быть интересны и участникам div1. Одной из самых сложных разобранных на текущий момент задач является задача 229 acmp.ru, можете посмотреть её уровень. Но такой уровень пока скорее исключение. Через некоторое время уровень задач повысится, и можно будет публиковать такую же статью с заголовком "Как поднять рейтинг codeforces с 1700 до 2000".

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

Я ненормальный, мне наоборот легче если 5-часовой чем одна задача.

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

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

    Эта статья ориентирована на тех, кому требуется больше регулярности тренировок. Если бы им было легко часто участвовать в 5-часовых тренировках, они тоже в достаточно короткий срок (порядка года) стали бы "красненькими".

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

А почему acmp, а не например тимус?

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

    Мне нравится Тимус, лично у меня там решено довольно много задач. Но всё-таки простые задачи там порой крайне бессмысленные, а осмысленные задачи там не простые. В итоге сложнее подобрать задачи с плавным возрастанием сложности с самого нуля.

    Но после исчерпания "хороших" задач acmp.ru продолжение ожидается на Тимусе.

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

Ух ты, Фёдор Владимирович, и Вы здесь. Здорово!

Я как раз сейчас решаю задачи из Вашей книжки. Она мне уже обеспечила несколько часов приятного времяпрепровождения. Спасибо за труд. Правда ограничения 16-битной архитектуры компилятора Турбо Паскаль больше не актуальны и некоторые задачки теперь можно сдать одним кодом, а на многих других можно "считерить" использованием большого объёма памяти или встроенных в язык продвинутых средств вроде STL в C++.

А еще мне в мои 22 как-то грустно быть синим и всерьёз решать задачи для школьников. Но я надеюсь что не всё потеряно и мои спортивно-программистские навыки, после некоторого обновления, мне еще пригодятся.

Я воспользуюсь предложением и напишу письмо.