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

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

Всем добрый день.

На прошлой неделе в Санкт-Петербурге начались традиционные учебно-тренировочные сборы школьников перед Всероссийской олимпиадой. Когда-то они выполняли отборочную роль, сейчас это лишь тренировки и учёба вместо школы. В пятницу я решил повторить свою прошлогоднюю лекцию про то, как вести себя на контестах и что может помочь/мешать решать задачи/набирать баллы, кроме знания алгоритмов. Алгоритмы рассказывают везде: и на e-maxx.ru, и в ЛКШ, и на Хабре, и на Codeforces. А вот никакой общедоступной информации на тему "а как организовать себя на контесте" я не видел. Когда я был школьником, разве что иногда кто-нибудь из преподавателей мимолётом замечал, что неплохо бы читать все задачи в первые минуты и писать заглушки когда-нибудь в течение контеста, потому что "напишете заглушки по каждой из шести задач — будет второй диплом на Всеросе".

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

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

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

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

Что-то новое, это намного интересней, чем 100500 лекций на тему "как еще можно написать дерево отрезков".

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

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

    1. После первых часов контеста каждую задачу должно прочитать хотя бы два участника и проверить, что понимание полностью сошлось.
    2. Если двум участникам нечего делать — им пора обменяться идеями по вообще всем задачам
    3. Даже если решение кто-то пошёл писать, бывает полезно второму участнику (который это решение знает) рассказать его третьему и проверить на идиотские ошибки.
    4. Компьютер не должен простаивать вообще — компьютерное время в три раза ценнее человеческого. Скажем, если нечего писать, можно написать перебор по тупой задаче и посмотреть на ответы.
    5. К сожалению, это не всегда работает: если писать вообще нечего (или осталась только фигня на кактусе), то имеет смысл потратить минут 10-15-20-300 на полный обмен идеями между всеми участниками команды, чтобы точно быть уверенными в отсутствии лучшей альтернативы.
    6. Писать вдвоём/втроем (один пишет, другой диктует/контроллирует) полезно: помогает отлавливать идеологические ошибки и опечатки. Разумеется, это скорее замедляет процесс написания.
    • »
      »
      »
      11 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +24 Проголосовать: не нравится

      .

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

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

        Я говорю именно про парное программирование: когда чтобы каждую написать следующую строчку, два человека должны прийти к консенсусу.

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

        Блин, может, это немножко не в тему, но первый вариант у меня вызывает ностальгическое ржание:). Последние года два время от времени попадались задачи, в которой некоторая часть кода была чисто на творческую работу на листочке, и пишущий человек зачастую не понимал, почему я настоятельно требую обрабатывать такой случай и забить на другой. Тогда кодер(обычно Паша Холкин) говорил: "Ты понимаешь, что я это пишу, но за код я абсолютно не отвечаю?" В итоге получалось, что задача посылалась, а как она работает, по сути знал только я(а иногда даже я не знал). Учитывая, что я не самый внимательный человек на планете, посылки таких задач всегда были рискованными. Но, к счастью, зачастую проходили, чем вызывали продолжительный смех, особенно когда другие саратовские команды не могли ее сдать.

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

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

      .

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

        Увы — я только недавно начал что-то такое вести. Есть случаи, которые мы очень хорошо запомнили и сделали выводы. Не записаны, но стараемся помнить.

        Конечно, такая схема тоже ненадёжна. Хотя вот на финале у нас в Team Notebook был небольшой checklist на тему "что делать, если задача не сдаётся". То ли забыли, то ли не помог — точно не помню :(

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

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

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

      +1 к первому пункту. Даже очень сильные команды иногда про него забывают и из-за этого сливают важные контесты.

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

    Нашёл относительно древнюю презентацию на английском на тему командной работы и каких-то прочих мелочей. Автор, если не ошибаюсь — Андрей Лопатин (KOTEHOK)

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

      Ну все, теперь осталось только команду найти)

      А если серьезно — спасибо) Никаких шокирующих тайн там не увидел, но перечитать полезно. И несколько интересных моментов, вроде ошибки деления на 0 — для себя открыл)

      Я видел несколько статей и заметок по поводу командных стратегий, например, всем известная Как стать чемпионом мира по программированию — но все они довольно древние.

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

        Кажется, пора заводить сборник всем известных ссылок и очевидных вещей.

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

Спасибо! Можно ли посмотреть где-нибудь другие лекции со сборов? Думаю, многим бы они пригодились.

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

    Увы, это пока единственная записанная лекция, насколько я знаю. Я еще точно планирую в эту пятницу записать свою вторую лекцию на тему "как не бояться и сдавать сложные и техничные задачи и полезные фишки языков C/C++/C++11". Появится так же: где-то в начале следующей недели.

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

      Можно узнать что-нибудь о судьбе этой записи?

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

        Да. Она, в принципе, получилась. Но там есть много мест, которые надо обязательно править, иначе получится некорректная информация (например, в одном месте я совершенно нагло заявил, что move-конструкторы хоть когда-то автоматически генерируеются, что, разумеется, неправда, иначе бы это не было обратно совместимо). Я про неё в какой-то момент забыл, на неделе займусь редактированием и наложением субтитров с комментариями.

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

          Казалось бы

          1) C++11 действительно не обратно совместим
          2) move-конструктор таки генерируется(aka Implicit declaration), если нет кастомного copy/move конструктора

          Буду рад, если разубедишь)

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

          Можно узнать что-нибудь о судьбе этой записи?

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

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

            На самом деле, основная идея написания техник очень проста: дробим задачу на огромное количество задач поменьше и не такие страшные, пишем и отлаживаем их одну за одной, изолируем друг от друга в классах (тогда заодно можно будет писать юнит-тесты или заменять одну подзадачу на её "тупую реализацию" в целях отладки), добавляем тонны assertов (например "сошлось умное решение с тупым на тех же входных данных" — если всё написано через классы и методы, а не глобальные переменные, то это совсем просто).

            В частности, стоит разделять задачи даже в ущерб производительности (за исключением ситуации "точно надо очень сильно вгонять, а время есть только на одно решение, времени переписывать не будет никогда"). Например, если есть построение графа, dfs, а потом — heavy-light, то все промежуточные структуры стоит строить явно: так будет намного проще отлаживать (потому что каждая часть кода выполняет ровно один стандартный алгоритм) и понимать происходящее (потому что программа точно соответствует словесному описанию решению и можно рисовать промежуточные состояния).

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

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

Вообще говоря, по-моему была бы неплохой идея прикрепить это видео (и ещё другие если они будут) к сайту emaxx. Особенно учитывая то что вроде его обещали пообновлять в связи с переездом

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

"заставили протереть пианино" — это травма детства?) Не, на самом деле круто, и мало кто берется на тему поведения на контесте рассказывать (и мало кто может), обычно только руками разводят, что, дескать, кто как решает это только гены определяют (xd). И впрямь ведь есть вещи, поддающиеся контролю, и очень хорошо что кто-то рассказал, как у него это получается. Мне вот лично с другой стороны тренировка увиделась, т.е. что это не просто чуть менее унылый режим сбора плюсов, что действительно имеется необходимость проверить свои правила. Да и много чего там было сказано нового, все же человек явно больше на контесты поездил.

Еще одно — была идея, как можно начать иначе подходить к решению, внести по ходу просмотра не мог) Можно переписать условие, сохраняя баланс формальности/понятности, как это у себя в блоге делает Petr. Пример из последнего, вот это он записал как you were given a set of cells on the infinite grid, and were asked to find another set of cells that has the same number of cells in each row and in each column as the original set, but has the smallest possible intersection with the original set. Были там и более показательные примеры, но идея в том, что, как правило, выбор способа решения производится скорее по впечатлению, чем по продиктованной необходимости (это тоже только с некоторыми оговорками можно утверждать). А так условие предстает в виде, который можно назвать "изначальный". Но это тоже еще надо уметь так сформулировать.

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

    Нет, нужен был относительно необычный предмет, чтобы слушатели не засыпали и хоть что-нибудь запомнили.

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

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

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

        У меня и сейчас есть, даже в музыкальной школе на третьем курсе в соответствующем классе учусь. Но протирать скорее не заставляют :)

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

          С собой его туда не носишь?) А я вот дома буду скоро, синтезатор протру и обратно в шкаф) Единственное что я вынес из занятий на нем, так это что важно, чтобы музыкальные вкусы пианиста совпадали со вкусами соседей) Ну и что в первую голову надо учить две вещи — марш мендельсона и мурку, голодным тогда не останешься)

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

            Нет, не ношу и втихую подсмеиваюсь над гитаристами.

            А еще это лечится нормальной звукоизоляцией. Ну или занятиями на левой педали.

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

              Хе, ты что, если хотя бы медяк на повесишь на веревочку, считай не гитарист. Играть можно чуть позже поучиться, успеется. Ну а звукоизоляция что то на ум не приходит нормальная, ковры на стенах нынче не в моде, хотя на потолках уже где-то видел.

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

Кто-нибудь скиньте шпаргалку. Ссылка не работает.

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

    Ссылка работает. New link

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

      yeputons ссылка на конспект опять не работает, не могли бы Вы еще раз выложить, пожалуйста.

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

        Спасибо большое, сегодня-завтра должна появиться. Если не появится — пинганите меня ещё раз.

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

Какое английское слово используется как "заглушка"?

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

спустя 10 лет все равно актуально