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

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

Привет, Codeforces!

Весной 2016 года компания КРОК совместно с площадкой Codeforces проведет свой уже третий по счету Всероссийский Открытый чемпионат по программированию «КРОК – 2016». Цель этого проекта, как и прежде, — поощрение самых талантливых и прогрессивных молодых специалистов и стимулирование интереса к сфере информационных технологий.

Компания КРОК традиционно уделяет огромное внимание социальным проектам, связанным с развитием ИТ-отрасли, продвижением ИТ-профессий и повышением интереса к современным технологиям. У КРОК богатый опыт сотрудничества С ВУЗами, организации курсов, семинаров и олимпиад для школьников, студентов и опытных специалистов.

Регистрация на чемпионат откроется 1 марта на странице чемпионата на площадке Codeforces и продлится до окончания квалификации 16-го марта. Участником Всероссийского Открытого чемпионата по программированию «КРОК – 2016» может стать любой желающий вне зависимости от гражданства, места жительства и уровня образования. Участникам Чемпионата предстоит пройти два тура: дистанционный тур, который состоится в начале марта и финал, в котором сразятся 50 сильнейших участников в Москве 15 апреля. Участникам Финала КРОК-2016 будут покрыты транспортные расходы на сумму не более 10000 рублей (предполагается проезд обыкновенным купейным вагоном, либо, по согласованию, эконом-перелет самолетом). До 25-го марта необходимо подтвердить желание и возможность принять участие в финале в Москву.

Финалистов будет ждать теплый прием, встреча с организаторами мероприятия и экспертами по разработке программного обеспечения в КРОК, праздничный фуршет, увлекательный игровой раунд и отличные призы и подарки. Предыдущий чемпионат по программированию КРОК прошел в 2013 году и собрал 3500 программистов со всей России, из стран СНГ и других стран.

Призы

  • 1 место — 100000 рублей
  • 2 местo — 70000 рублей
  • 3 местo — 50000 рублей

Победитель игрового тура получит ноутбук.

Расписание этапов чемпионата

  • Квалификационный раунд – 16 марта
  • Отборочный раунд – 18 марта
  • Финал чемпионата состоится 15 апреля в Москве в офисе компании КРОК (50 участников)

Все раунды Чемпионата будут открыты для внеконкурсного участия для всей аудитории Codeforces. Отборочный раунд и Финал будут рейтинговыми раундами как для официальных участников, так и всех остальных.

Регистрация

Чтобы принять участие в чемпионате необходимо пройти регистрацию на странице регистрации Чемпионата. Регистрация будет открыта до окончания квалификации. Соревнуйся с лучшими программистами на Открытом Чемпионате "КРОК-2016"!



Зарегистрироваться!


История чемпионатов КРОК

Предстоящий чемпионат станет третьим по счету чемпионатом, проведенным компанией КРОК на площадке Codeforces. С информацией о чемпионатах вы можете ознакомиться, перейдя по ссылкам ниже:

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Всем привет!

13 марта в 15:00 начнется первый квалификационный раунд чемпионата VK Cup 2016!

Раунд продлится 24 часа, такая продолжительность выбрана для того, чтобы все нашли себе удобное время для участия. Квалификационный раунд, как и все предстоящие раунды, требует отдельной регистрации. Регистрация уже открыта и будет открыта на протяжении всего раунда.

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

Если вы пока не уверены в текущем составе команды, то не регистрируйтесь на предстоящий раунд. Если вы не будете участвовать в первой квалификации или не пройдете по ее результатам в Раунд 1, то вы сможете попробовать свои силы во второй квалификации.

Чтобы пройти в Раунд 1, вам надо принять участие хотя бы в одной из квалификаций. Из каждой квалификации в Раунд 1 проходят все команды с положительным числом баллов, которые набрали не меньше баллов, чем команда на 500-ом месте.

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

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

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

Полный текст и комментарии »

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

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

Hello!

Recently there were some comments about unexpected MLE verdict for Java solutions.

Now we experimentally run Java with the following command line (it is a part relevant to memory): -XX:NewRatio=5 -Xms8M -Xmx<ML> -Xss64M.

It is good to know that default java GC divides heap to generations (areas) and tenured (old) generation is less than entire heap size. We use -XX:NewRatio=5 to increase the tenured generation size. For example, if memory limit is 256M then tenured generation is about 200MB. For example, it means that you can not allocate array of size 210MB in your program. Note, that without -XX:NewRatio=5 the tenured generation size is ~170MB.

Also I tried option to use G1 garbage collector, but it seems it works much slower for programming competition codes.

If you want to suggest improvements, please test your suggestion on the following cases:

Note, we use javaagent for JVM to intercept java.lang.OutOfMemoryException exceptions and return them as MLE verdict. It doesn't affect StackOverflowException or any other exception.

Also we use hard memory limit per process (because of possible off-heap allocations) which is about 20MB larger than ML (~20MB is memory consumed by simple almost empty solution).

BTW, what options use Yandex.Contest, ejudge, PCMS2 and other judges to run Java?

Полный текст и комментарии »

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

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

Привет, Codeforces!

Мы с радостью сообщаем вам, что компания ВКонтакте совместно с площадкой Codeforces вновь проводит чемпионат VK Cup. К участию в VK Cup 2016 допускаются команды до двух человек, так как практика парного программирования широко распространена во всем мире, в том числе и ВКонтакте. За призы и звание победителя приглашается побороться русскоязычным молодым специалистам, студентам, школьникам и просто любителям алгоритмов и программирования.

Лучшие 20 команд по результатам отборочных интернет-этапов будут приглашены в финал соревнования, который состоится в июле 2016-го года в прекрасном городе Санкт-Петербурге. Компания ВКонтакте покроет расходы на проезд и проживание финалистов, которые будут бороться не только за звание лучших из лучших, но и призовой фонд чемпионата. Как и в прошлом году призы соревнования связаны с круглыми числами в двоичной системе счисления:

  • 1 место — 1048576 рублей
  • 2 местo — 524288 рублей
  • 3 местo — 262144 рубля
  • 4-8 места — 131072 рубля

Полный текст и комментарии »

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

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

В 16:00 (московское время) 4 марта 2016 г. Mail.Ru Group совместно с МФТИ, МГТУ им. Н. Э. Баумана и Codeforces запускает Технокубок — первую совместную олимпиаду по программированию для школьников. На кону — дополнительные баллы при поступлении в престижные технические вузы России и ценные призы.

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

Организаторы олимпиады


Московский физико-технический институт


Московский Государственный Технический Университет им. Н. Э. Баумана


IT.Mail.Ru


Codeforces

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

Этапы соревнования

Ознакомительные раунды
21 марта 00:00 — 23 марта 17:00, 24 марта 00:00 — 26 марта 11:00

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

**Отборочный (онлайн) этап **
23 марта 18:00 — 20:00, 26 марта 10:00 — 12:00

Пользователи могут участвовать как и в первом, так и во втором онлайн-раунде. Лучшие 150 участников каждого из онлайн-раундов будут приглашены к участию в заключительном этапе, но не более 45% от общего числа участников раунда. До 5 апреля приглашенные в заключительный этап должны подтвердить желание и возможность участия в нем. В случае отсутствия подтверждения, жюри может пригласить следующего участника по результатам соответствующего онлайн-раунда.

Заключительный (очный) этап в МГТУ им. Н. Э. Баумана и МФТИ
17 апреля

Заключительный этап будет проходить очно на площадках вузов. Участники, прошедшие онлайн-этап, побывают в лучших технических вузах страны и смогут получить ответы на вопросы по поводу поступления. Награждение пройдет в тот же день в офисе Mail.Ru Group, для победителей и призеров будет организован трансфер с площадок вузов. Победители и призеры олимпиады познакомятся со специалистами крупнейшей IT-компании в России, а также узнают про возможности карьерного роста в IT-сфере для абитуриентов МФТИ и МГТУ им. Н. Э. Баумана. Проживание и проезд осуществляется за счет участников. При наличии возможности по решению Оргкомитета возможна частичная оплата расходов на проживание. Для остальных мы подберем рекомендации по проживанию за невысокую цену близ площадок вузов.

Призы

Дополнительные баллы в МФТИ и МГТУ им. Н. Э. Баумана:

  • Победителям (диплом I степени) — 8 баллов
  • Призерам (диплом II, III степени) — 6 баллов

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

Ценные призы:

  • 1 место iPad mini 2 + Технокубок
  • 2 место iPod nano
  • 3 место iPod shuffle

Регистрация начнется в 16:00 (московское время) 4 марта на сайте: https://it.mail.ru/technocup/

Сразитесь за звание самого талантливого молодого программиста и за право стать первым обладателем Технокубка!

Олимпиада проходит по правилам раундов Codeforces.

Чемпионат Технокубок входит в число инициатив Mail.Ru Group, направленных на развитие российской IT-отрасли и объединённых ресурсом It.Mail.Ru. Платформа It.Mail.Ru создана для тех, кто увлекается IT и стремится профессионально развиваться в этой сфере. Проект объединяет чемпионаты Russian AI Cup, Russian Code Cup и Russian Developers Cup, образовательные проекты Технопарк в МГТУ им. Баумана, Техносфера в МГУ им. М.В. Ломоносова и Технотрек в МФТИ. Кроме того, на It.Mail.Ru можно с помощью тестов проверить свои знания по популярным языкам программирования, узнать важные новости из мира IT, посетить или посмотреть трансляции с профильных мероприятий и лекции на IT-тематику.

*Дополнительные баллы могут получить учащиеся 8 – 11-х классов образовательных учреждений. Действие льготы — 4 года.

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Привет.

Если вы еще думаете, стоит ли участвовать в новом чемпионате КРОК (я-то уверен, что надо быстрее регистрироваться!), то посмотрите ролики КРОК о чемпионате (или для чемпионата) 2013-го года.

А вот в таких роликах в качестве актеров поучаствовали организаторы чемпионата того года:

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

По всей России идет первый тур олимпиады. Болеем за ребят! Напоминаю, что что-либо спойлерить до окончания нельзя.

Интересно, в каких областях как проводят? Почти все на Яндекс-Контесте? Как впечатления?

Саратов проводит на отдельном интерфейсе для Codeforces, выглядит так:

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Добрый день.

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

Вот так, например, сайдбар выглядит на моем телефоне:

пример

Отказаться от мобильного вида (или, наоборот, включить его) можно внизу страницы в футере.

P.S. На старых браузерах, да и вообще на не-webkit могут быть сложности. Не уверен, что их легко исправить :-(

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Добрый день!

Вот вам немного статистики в виде графиков и чартов за 2015-й год. Я очень доволен их бодрым ростом. На самом деле, каждый год я боюсь обнаружить Codeforces в состоянии плато и каждый год я радуюсь, видя ваш интерес и энтузиазм. Так держать! Вот и опять по разным метрикам мы видим в этом году 20-50% рост!

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

А вот и веселые картинки со статистикой:


Рост количество зарегистрированных пользователей. Перевалили 300 тысяч в этом году!

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Привет!

Поздравляю всю аудиторию Codeforces с Новым Годом! Конечно, этот год опять не будет простым (ведь 2016 делится на 2, 3 и 7). Желаю вам интересных задач, красивых решений и успешных попыток на последних секундах! Желаю не терять интерес к такого замечательному делу как программирование, верить в свои силы и регулярно находить подтверждение этой вере. А еще не болейте и побольше улыбайтесь (даже если слив). Ура!

В настройках профиля появился волшебный раздел. С Новым годом!

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, перевод, По-русски

В Новый год мечты сбываются: вы можете сменить хэндл до 10-го января

Открыта традиционная новогодняя акция. Спешите! Только до 10-го января вы можете изменить свой хэндл абсолютно безвозмездно, то есть даром! Сменить хэндл можно лишь единожды. Обратите внимание, что откатить изменения или изменить хэндл еще раз вы сможете только через год. Будьте внимательны и осторожны со своими желаниями! :)

Хэндл можно сменить либо на совсем новый (ранее никем никогда не используемый), либо на тот, который у вас был когда-то ранее. Кстати, ссылки на ваш профиль с прошлым хэндлом работать не перестанут — будет автоматический редирект со старого хэндла на новый. У нас все ходы записаны!

Для смены хэндла нажимайте в профиле "Настройки", затем "Хэндл", а потом внимательно читайте всё то, что написано.

Касательно необдуманных хэндлов я всегда вспоминаю такую историю. Мне как-то написал пользователь с просьбой: "Прошу сменить мой хэндл с I_love_Valya на I_love_Sveta, так как Валю я больше не люблю..."

С новым годом!

Полный текст и комментарии »

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

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

Добрый день.

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

Я собрал в список всех тех нововведений, которые в той или иной степени коснулись кого-то (или всех) из пользователей. В этом безликом списке нашли свое место результаты многодневной работы каждого члена (иногда c приставкой ex-) технической команды Codeforces: MikeMirzayanov, MaximShipko, kuviman, fcspartakm, Avalanche. Есть и ценные помощники Edvard (помог с внедрением образовательных раундов), stingray (постоянная помощь с администрированием и настройкой серверов бесценна), demlit и lthirteenthl (помощь с администрированием и железками). И это я только перечислил тех, кто помогает в техническом плане — есть еще важный список всех тех, кто способствует развитию и жизни Codeforces в других аспектах. Спасибо!

А вот и обещанный список завершенных (иногда частично) наших дел в 2015-м году.

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Всем привет!

Надеюсь у вас уже праздничное настроение?

Чуть позже я опубликую статистику за год и расскажу про наши достижения за год, а пока речь пойдет о чемпионатах и соревнованиях, которые мы сделали с партнерами в 2015-м году. Сюда не вошли какие-то мероприятия, которые мы делали совсем далеко от площадки Codeforces (например, Russian AI Cup).

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

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Добрый день.

Теперь для поиска по постам вам вовсе не обязательно уходить в Google, а можно это делать прямо на Codeforces. Мы поддержали поиск по текстам постов на базе Apache Lucene. В индексе содержатся все открытые публичные посты, которых уже более 15000 штук.

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

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

Вот примеры запросов:

  • 305 — ищет все посты, содержащие 305, найдет посты про Раунд 305
  • andrew stankevich contests — можно писать сразу много слов, будут искаться все
  • user:mikemirzayanov title:сазанка — ищет все посты в названии со словом "сазанка" авторства MikeMirzayanov
  • "vk cup" — можно использовать кавычку, чтобы искать точные совпадения
  • title:educational — искать в названии

По поводу индексирования комментариев, исходных текстов решений и тестов условий есть ощущение, что это может оказаться бесполезным. Слишком сложно будет найти что-то релевантное (а может и нет). Как вы думаете, стоит делать?

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Добрый день.

В режиме ранней беты мы запускаем новую фишку Codeforces, которая будет полезна многим активным пользователям сайта. Теперь вы можете создавать, управлять и использовать "списки пользователей".

 menu

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

У списка есть название и два относительно секретных ключа — один для его просмотра/использования, а второй для редактирования. Например, вот ключ для просмотра на список со студентами ЦОПП-СГУ на осень 2015-го года: 15c68c2cf878267d59373d1e56be8c9a

Это означает, что на некоторых страницах вы можете использовать дополнительный параметр ?list=ключ, чтобы применить список. Вот пример кусочка экрана по ссылке http://codeforces.me/problemset/page/3?list=15c68c2cf878267d59373d1e56be8c9a:

Ага, на ближайшую тренировку я могу дать задачи 538H - Летняя дихотомия и 538G - Осатаневший робот. Первое число обозначает количество решивших задачу, а второе — количество попытавшихся ее решить. Поиск в таких случаях производится не только по конкретно этой задаче, но по всем возможностям ее использования (сдал задачу в другом дивизионе или мэшапе — информация не потеряется!).

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

В настоящий момент списки можно применить:

  • для просмотра архива (показывается дополнительно сколько решили/попробовали)
  • для просмотра списка раундов/тренировок (показывается дополнительно сколько решили/попробовали)
  • для просмотра результатов раунда (фильтруется списком)

Напоминаю, что функциональность пока в режиме ранней беты — возможны какие-то накладки. Исправим (но после полуфинала).

А в какие еще применения спискам пользователей можете предложить вы?

Полный текст и комментарии »

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

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

Задачи учебные — постараемся сделать разбор подробным.

598A - Tricky Sum

Если бы в этой задаче не было бы "хитрости" и надо бы было просто найти сумму 1 + 2 + ... + n, то, воспользовавшись формулами суммирования арифметической прогрессии, можно было прийти к результату s = n·(n + 1) / 2 (числа такого вида называются треугольными).

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

long long pow2 = 1;
while (pow2 <= n)
    s -= pow2 * 2, pow2 *= 2;

Значение s после такого цикла и будет ответом. Количество итераций этого цикла не превосходит двоичного логарифма числа n (точнее — еще плюс единица), что является числом около 30 для максимального возможного теста.

Асимптотика: (на один тест в наборе).

598B - Queries on a String

Так как значения ki довольно велики (до миллиарда), то попробуем найти решение, которое не моделирует все ki вращений. Очевидно, что если рассматривать k-й циклический сдвиг строки длины t, то все сдвиги, кратные t, не меняют строку. Более того, k-й циклический сдвиг строки длины t неотличим от сдвига на величину k mod t (остаток от деления k на длину t).

Таким образом, сразу после чтения очередного запроса можно заменить ki на ki mod (ri - li + 1). Далее определим результат после запроса i. Части строки до li и после ri останутся без изменения. А вот подотрезок li... ri провернётся на ki. Это значит, что вперед встанут заключительные ki символов этой подстроки, а потом — часть подстроки без заключительных ki. В итоге обработанный подотрезок будет записан так: s.substr(r - k + 1, k) + s.substr(l, r - l + 1 - k) (участок длины k от позиции на k - 1 левее r + участок длины "длина подотрезка минус k" от позиции l). Следовательно, весь запрос обрабатывается фрагментом кода:

s = s.substr(0, l)
    + s.substr(r - k + 1, k) + s.substr(l, r - l + 1 - k)
    + s.substr(r + 1);

Конечно, в данной задаче удобнее было бы воспользоваться функцией std::rotate, от этого код стал бы только короче. Однако такой подход более С++-специфичный. Эквивалентная строка с использованием std::rotate выглядит так: rotate(s+l,s+r+1-k,s+r+1);.

Асимптотика: O(|sm).

598C - Nearest vectors

На этой задаче споткнулись очень многие участники. Некоторые даже очень опытные участники соревнований допустили ошибки. Видимо, эта задача проходит с использованием atan2 в long double на g++ (но не на Visual Studio, так как в ней long double имеет такой же размер как и double — 8 байт).

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

В своих решениях с несложной геометрией я люблю использовать typedef pair<T,T> pt (где T — основной тип данных для точки/вектора), одновременно с дефайнами X на first и Y на second.

Грубо говоря, план решения такой: отсортируем все вектора по полярному углу, затем переберем все пары соседних векторов и выберем такую, угол между векторами в которой минимален.

Для того, чтобы отсортировать что-либо, надо определить функцию порядка "меньше" (возвращает true тогда и только тогда, когда первый аргумент строго меньше второго).

Ниже будем использовать псевдоскалярное произведение векторов (cross(a, b) = a.X * b.Y - a.Y * b.X), которое для простоты будем называть просто векторным. Напомним, что оно равно |a|·|bsin(a, b), где sin(a, b) — синус ориентированного угла от первого вектора ко второму. Поэтому знак векторного произведения указывает "верно ли, что угол от первого до второго вектора меньше 180 градусов?" или (что тоже самое) "верно ли, что кратчайший способ совместить (сонаправить) первый вектор со вторым будет двигать первый вектор против часовой стрелки?". Когда величина равна 0 — это значит, что всё равно, как: то есть вектора либо сонаправлены, либо противонаправлены.

Поэтому, чтобы понять, верно ли, что при сортировке первый вектор должен предшествовать второму, почти всегда достаточно посмотреть на знак векторного произведения (больше нуля — значит, "да"). Однако это не будет работать на стыке при переходе через цикл (например, вектор (1, -1) будет определен как стоящий до вектора (1, 1)). Для этого сначала сравним полуплоскости, в которых они расположены (при Y = 0 в верхнюю полуплоскость отдадим положительное направление луча Ox). Функция top определяет "верно ли, что p лежит в верхней полуплоскости?".

bool top(pt p) {
    return p.Y < 0 || p.Y == 0 && p.X < 0;
}

Следовательно, полностью функция "меньше" для сортировки векторов по полярному углу в целых числах выглядит так:

bool polarLess(const pt& a, const pt& b) {
    bool ta = top(a);
    bool tb = top(b);
    if (ta != tb)
        return ta;
    return cross(a, b) > 0;
}

Теперь решим вторую подзадачу — для четырех векторов a1, b1, a2 и b2 проверить, верно ли, что угол между a1 и b1 строго меньше угла между a2 и b2.

Напомним, что неориентированный угол между векторами a и b можно получить так: представим, что мы расположили оба вектора так, что вектор a встал по направлению Ox (т.е. просто вправо). Тогда будет достаточно найти полярный угол для b (координату b.Y надо взять по модулю, так как угол неориентированный). Но вектор a не направлен вдоль Ox. Давайте найдем длину проекции b на a (это на самом деле x в системе координат, что направлена так, как нам хочется) и длину проекции b на вектор, повернутый от a на 90 градусов (перпендикулярный) влево. Длину первой проекции найти легко — это |bcos(a, b), а длина второй проекции — это |bsin(a, b). Однако, если мы возьмем просто скалярное произведение, то получим |a|·|bcos(a, b), а векторное — |a|·|bsin(a, b).

То есть вектор p = (dot(a, b), cross(a, b)) (где dot(a, b) — скалярное произведение) — это вектор, сонаправленный вектору b' (где b' — результат поворота вектора b, если одновременно вращать и b и a так, что a совпадет с Ox). Здесь хорошо бы сделать рисунок, но уже не до этого.

Таким образом, например, чтобы найти ориентированный угол между векторами (от  - π до π), достаточно взять направление вектора p; иными словами, atan2(cross(a, b), dot(a, b)). Если нужен угол неориентированный, то от векторного произведения (а это фактически координата y у вектора p) надо взять модуль.

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

Таким образом, полный код функции "меньше" для величины угла между векторами a1 и b1 против величины угла между векторами a2 и b2 выглядит так:

bool angleLess(const pt& a1, const pt& b1, const pt& a2, const pt& b2) {
    pt p1(dot(a1, b1), abs(cross(a1, b1)));
    pt p2(dot(a2, b2), abs(cross(a2, b2)));
    return cross(p1, p2) > 0;
}

Асимптотика: (на сортировку).

598D - Igor In the Museum

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

Асимптотика: O(n·m + k) (каждая клетка обходится не более одного раза).

598E - Chocolate Bar

Здесь надо подробнее описать динамическое программирование, которое используется в решении. В решении ниже dp[a][b][k] — ответ на задачу, если есть плитка размера a × b и надо наотламывать k долек из нее. В приведенном решении используется ленивое программирование (каждое состояние анализируется фактически не более раза с помощью поиска в глубину по состояниям) для подсчета таких значений: 14258732.

Асимптотика: (K — оценка на k, то есть 50).

598F - Cut Length

Эту задачу я когда-то давно подготовил на тренировку СГУ. Ее сдали несколько наших сильных участников (возможно, в дорешку): Nerevar, e-maxx, RAD, stan, NALP. По результатам взломов — все их решения оказались неверными! Участники Educational Codeforces Round 1 добавили отличные тесты!

Вот короткое решение одного из участников раунда (и эффективного взломщика): 14258627.

Асимптотика: (для обработки одной прямой нужна сортировка всех точек пересечения её и многоугольника).

Заключение

Я буду рад дать права на пост тому, кто поможет перевести разборы или улучшит наброски разборов по задачам D-F. Спасибо!

Полный текст и комментарии »

Разбор задач Educational Codeforces Round 1
  • Проголосовать: нравится
  • +28
  • Проголосовать: не нравится

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Закончен Educational Codeforces Round 1. 24 часа после окончания фазы основного участия многие из вас пытались взломать соперников, и у многих это получилось!

Всего было сделано 573 успешных взлома, а общее число "взломщиков" — 101. Вот самые результативные из них:

Хэндл Кол-во успешных взломов
1 yashkumar18 36
2 halyavin 31
3 TrungPhan 26
4 Orenji.Sora 25
5 ykaya 24
6 NotPassedCET4 23
7 greencis 22
8 kondranin 20
9 Allanur 19
10 bayram98 18
11 waterfall 17
12 kalimm 17
13 muratt 13
14 lifecodemohit 11
15 hnust_zhaozhixuan 11
16 BigBag 11
17 Luqman 10
18 choosemyname 10
19 White_Bear 10
20 liao772002 9

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

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

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

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Всем привет!

Во-первых, приглашаю вас принять участие в неофициальном тестовом раунде Testing Round 12. Дело в том, что команда Codeforces внесла множественные изменения в платформу (о чем чуть позже), и все мы хотим быть уверенными, что основная функциональность осталась без изменений. Этот раунд будет иметь сокращенную длительность 1.5 часа, состоять из 3 (может, и 4) задач, которые вы могли уже где-то и видеть ранее. Цель его — с одной стороны, протестировать систему, а с другой — скрасить вечер среды. Конечно, раунд будет нерейтинговым.

Теперь самое главное. В ближайшую пятницу (да, 13-го ноября) Codeforces стартует еще одну линейку раундов. Мы назвали их учебными раундами (Educational Rounds). На примере моих студентов в Центре олимпиадной подготовки программистов Саратовского государственного университета (ЦОПП-СГУ) я регулярно замечаю, что даже те из них, кто имеет заметный прогресс в результатах на раундах, зачастую имеют неширокий кругозор в плане стандартных тем и идей, не знакомы с многими методами. Дело в том, что раунды обычно избегают каких-то фольклорных или классических тем, в результате страдает кругозор очередного поколения участников.

Мы рады объявить о старте серии учебных раундов! Они будут проходить с регулярностью 2-4 раунда в месяц.

Вот их характерные черты:

  • продолжительность классическая — 1.5 — 2.5 часа;
  • ставят перед собой в большей степени тренировочную и образовательную цель, чем соревновательную;
  • допускается использование не только задач, но и упражнений;
  • будут переиспользованы полезные, пусть даже и известные идеи с целью познакомить с ними широкий круг участников;
  • часто формальные тексты условий;
  • нерейтинговые (возможно, пока);
  • будем пробовать проводить в режиме ACM-ICPC (если будут большие очереди, возможно, поменяем подход);
  • те результаты, что получаются после окончания раунда, являются предварительными;
  • после окончания раунда будет период (длительностью в сутки) открытых взломов — любой посетитель Codeforces может попытаться взломать любое полное решение задачи из прошедшего раунда (как с контеста, так и прошедшее в дорешивании); при такого вида взломах доступен текст решения (можно копировать текст и, например, стрессить);
  • все успешные взломы из предыдущего пункта будут добавлены в официальный набор тестов, и немногим более чем через сутки после окончания раунда будет сделано перетестирование всех полных решений;
  • только после окончания перетестирования подводятся окончательные результаты раунда; результаты раунда подводятся отдельно по дивизионам;
  • наши возможности по проработке таких задач ограничены, поэтому в самом деле наборы тестов от жюри ожидаемо могут оказаться неполны — мы надеемся на ваши взломы!

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

Пока подготовка задач к этим раундам будет сосредоточена в Центре олимпиадной подготовке программистов СГУ, основную работу по задачам будет выполнять Эдвард Edvard Давтян. Пожелаем ему удачи, энтузиазма и сил!

До встречи на Testing Round 12, а чуть позже и на Educational Codeforces Round 1.

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

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

Основная концепция используемых формул — мы расширяем принципы рейтинга Эло для встреч более чем двух участников.

Каждый участник характеризуется величиной рейтинга ri — целое число (возможно отрицательное). Грубо говоря, чем это значение выше, тем лучше участник выступает в соревнованиях. Рейтинг это подсчитывается/пересчитывается таким образом, чтобы выполнялось равенство:

где Pi, j вероятность того, что i-й участник победит на соревновании j-го. Таким образом вероятность победы одного участника над другим определяется только разностью их рейтингов. Например, если разница рейтингов двух участников равна 200, то побеждает сильнейший с вероятностью примерно 0.75. При разнице рейтинга 400 вероятность возрастает до 0.9.

После очередного соревнования величины ri меняются так, чтобы в большей степени соответствовать основной формуле рейтинга. В данном случае “вероятность” какое-то расплывчатое понятие, последние соревнования вносят больший вклад в ожидаемый результат.

Рассмотрим момент до начала раунда и посчитаем для каждого участника его ожидаемое место (его называют seedi). Ожидаемое место равно сумме вероятностей по всем другим участникам обойти данного плюс один (плюс один берется из-за 1-индексации):

Например, перед Codeforces Round 318 [RussianCodeCup Thanks-Round] (Div. 1) при рейтинге 3503 ожидаемое место у tourist было примерно 1.7, а у Petr при рейтинге 3029 ожидаемое место было примерно 10.7.

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

Посчитаем для участника среднее геометрическое его текущего места и ожидаемого, пусть эта величина равна mi. В самом деле, это какое-то среднее значение между ними, оптимистично сдвинутое в сторону меньшего из мест. Найдем (с помощью бинарного поиска) такой рейтинг R, которым должен бы был иметь этот участник, чтобы всё-таки ожидаемо занимать место mi (среди того же набора участников). Текущий рейтинг участника должен быть изменен так, чтобы стремиться к R. Поэтому, изменение рейтинга участника в раунде вычисляется как di = (R - ri) / 2.

Это почти всё, кроме фазы борьбы с инфляцией. Заметим, что при инфляции богатые становятся еще богаче, поэтому будем бороться именно с этим. Если предположить, что рейтинг был уже посчитан справедливо (то есть каждый участник имеет свой статистически обоснованный рейтинг), то математическое ожидание изменения рейтинга по любому участнику должно быть равно 0. Выберем группу наиболее высокорейтинговых участников раунда (по рейтингу ri — до начала раунда) и скажем, что сумма их рейтингов должна остаться неизменной. В качестве размера такой группы выбирается эвристическая величина . Если di таковы, что их сумма для этой группы не равна 0, то ко всем им (по всем n участникам) прибавляется некоторое значение (вычитается) так, чтобы их сумма по s наиболее высокорейтинговым участникам стала равна 0.

После раунда 327 ограничили этот эффект: сначала к каждому изменению прибавляется величина inc =  - sum(di) / n - 1 (то есть di меняются), затем прибавляется inc = min(max( - sum(di) / s,  - 10), 0). Таким образом, эффект изменения рейтингов из абзаца выше ограничен падением каждого рейтинга не более чем на 10.

Кстати, для любого логически непротиворечивого рейтинга должны выполняться несколько инвариантов:

  • если участник A имел рейтинг хуже участника B и выступил хуже него на текущем раунде, то и его рейтинг после пересчета должен быть не лучше чем у B;
  • если A выступил лучше B, но имел до раунда хуже рейтинг, то ему должны прибавить не меньше единиц рейтинга чем участнику B.

В частности, для обновленного рейтинга Codeforces эти инварианты проверяются на выполнение при любом пересчете рейтинга.

Ознакомиться с используемым кодом можно по ссылке: 13861109.

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Вы можете распечатать PDF-версию условий: http://assets.codeforces.com/statements/589.pdf

Пару дней назад был завершен четвертьфинал ACM-ICPC в Саратове. От лица жюри и организаторов еще раз поздравляю победителей, призеров и прошедших в полуфинал. Призовые места завоевали (ура!):

  • 1 место: Нижегородский государственный университет #1 (Владислав vepifanov Епифанов, Николай KAN Калинин, Михаил mike_live Кривоносов)
  • 2 место: Университет Иннополис (Евгений savinov Савинов, Сергей sokian Киян, Александр map Машрабов)
  • 3 место: Саратовский государственный университет #1 (Эдвард Edvard Давтян, Виталий kuviman Кудасов, Данил danilka.pro Сагунов)

В субботу (17-го октября) в 11:00 здесь состоится неофициальная трансляция прошедшего соревнования. Вас ждут интересные задачи, которые жюри постаралось сделать интересными как для начинающих, так и опытных участников. К участию приглашаются как команды из 1-3 человек, так и индивидуальные участники. Контест не будет влиять на рейтинг Codeforces.

Конечно, контест будет нерейтинговым. Рекомендуется командное участие. Скорее всего, позже он будет перенесен в Тренировки.

Желаю участникам!

Председатель жюри MikeMirzayanov.

P.S. Мы сожалеем, что наша трансляция пересекается с другими онлайн-турнирами, но поскольку запланированное изначально время в воскресенье оказалось занято трансляцией московского четвертьфинала NEERC, то подвинуть наше соревнования не представляется возможным. Если вы являетесь школьной командой, то рекомендуем обратить внимание на Интернет-версию Уральской региональной командной олимпиады.

Полный текст и комментарии »

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

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

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

Со временем это привело к значительным перекосам в цветах и званиях. Например, стать красным в 2015-м году стало значительно проще, чем в 2013-м.

Проведя опрос о том как именно следует внедрить смену цветовой шкалы, мы решили не затягивать нововведения и рады анонсировать обновленные цвета и звания!

Коротко основные изменения: новый цвет: сине-зеленый или циан — как и ожидается из названия этот цвет займет своё место между зеленым и синим, теперь участники второго дивизиона будут лучше дифференцированны; сдвиг всех цветов вверх по шкале рейтинга — смотрите таблицу ниже, достигать вершин станет сложнее; легендарный гроссмейстер — новое звание и раскраска для тех, кто достиг заоблачного рейтинга 2900.

Холодные цвета серый, зеленый, сине-зеленый и синий всё еще соответствуют второму дивизиону, а остальные — первому.

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

Таблица ниже иллюстрирует новые значения границ цветов и званий

Границы рейтина Цвет Звание Дивизион Кол-во Кол-во (цвет)
2900+ Красный Легендарный гроссмейстер 1 4 183
2600 — 2899 Красный Международный гроссмейстер 1 46
2400 — 2599 Красный Гроссмейстер 1 133
2300 — 2399 Оранжевый Международный мастер 1 163 380
2200 — 2299 Оранжевый Мастер 1 217
1900 — 2199 Фиолетовый Кандидат в мастера 1 1253 1253
1600 — 1899 Синий Эксперт 2 5095 5095
1400 — 1599 Сине-зеленый Специалист 2 8202 8202
1200 — 1399 Зеленый Ученик 2 5736 5736
0 — 1199 Серый Новичок 2 2319 2319

По состоянию на 1-е октября 2015-го года, учитываются только активные пользователи (кто принимал участие в последние полгода).

О том как изменятся формулы рейтинга (да, они будут открытыми!) я напишу в ближайшее время.

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Да! Совсем скоро на Codeforces будет внедрена пачка улучшений касательно рейтинга и цветов. Вторая революция цветов и званий уже близка!

В скором времени вас ждет новый рейтинг с открытыми формулами, новые границы цветов и еще некоторые сюрпризы.

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

В связи с планируемой сменой границ цветов у нас возникла неопределенность, как именно внедрить нововведение. Здесь есть две опции.

Опция первая: только вперед, не оглядываемся назад

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

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

Опция вторая: сохраним историю

При введении новых границ цветов оставим цвета как есть в старых ранклистах, постах и комментариях. Это не сломает комментарии в стиле "поздравляю с красным цветом!" (но так ли они ценны?) Такой подход сохранит достижение "стал красным", то есть такой пунктик в вашей биографии никуда не денется и останется подкреплен документально.

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

Итого

Как вы видите, оба варианта имеют свои плюсы и минусы. Честно говоря, даже у меня нет уверенного мнения как лучше поступить. По этой причине предлагаю проголосовать и совместно взвесить за и против. Если один из вариантов победит со значительным отрывом, то реализуем его. Иначе сделаю на своё усмотрение.

Пожалуйста, голосуйте только внимательно ознакомившись с опциями. Первые два комментария к посту будут соответствовать возможным опциям. Негативные голоса учитываться не будут, а положительные будут иметь веса 1-2-4-8-16-32 в зависимости от цвета (серый-зеленый-синий-фиолетовый-оранжевый-красный). Голосование секретное, результаты будут 1-го октября вечером.

UPD: Голосование завершено. Мы поздравляем первую опцию с убедительной победой! Она набрала 6394 баллов против 2320 баллов у второй опции. Комментарии для голосования удалены, чтобы не влиять на статистику голосов по комментариям. Ждите нововведений в ближайшее время!

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

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

Итак, вы прочли задачу и не знаете как ее решать. Попробуйте следующие приемы, зачастую какой-то из них может помочь.

Прием 1: "Вспомнить всё"

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

Прием 2: "От частного к общему"

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

Популярные примеры упрощений (частных случаев):

  • вам сформулирована задача для дерева, рассмотрите ее вариант, когда дерево вырождается в путь;
  • в задаче фигурируют веса? рассмотрите вариант, когда все веса равны единице, или произвольному числу или есть только два различных веса (и так далее).

Обратите внимание, что решение частного случая почти всегда не проще общего, поэтому надо пытаться найти максимально простое или эффективное решение.

Прием 3: "Смелая гипотеза"

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

Примеры частых гипотез:

  • ответ всегда существует;
  • количество состояний небольшое.
Прием 4: "Чтобы решать задачу, ты должен думать как задача"

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

Прием 5: "Думаем вместе"

Этот прием применим только в командных контестах. Вдвоем или втроем начинайте по очереди озвучивать какие-то понятные факты про задачу. Например: "если n четное, то ответ всегда 0", "если n простое, то решать надо так" и так далее. Иногда ваши коллеги будут подхватывать идеи и развивать их, так можно и дожать идею решения задачи до конца.

Прием 6: "Подбери метод"

Попробуйте перебрать популярные алгоритмы или методы, которые хоть как-то могут оказаться применимы для задачи. Полезно посмотреть на ограничения по задаче. Зафиксировав метод, попробуйте подумать над решением предположив, что задача решается с применением этого метода. Надо рассуждать как-то так: "Пусть задача решается с помощью разделяй-и-властвуй. Тогда пусть мы рекурсивно решили задачу для левой и правой половине, осталось как-то объединить эти ответы, как бы это сделать..."

Прием 7: "Распечатать-посмотреть"

Очень часто (особенно в задачах с небольшим вводом — одно/два числа) возникают какие-то закономерности в построении ответа. Чтобы увидеть закономерность иногда достаточно написать какой-то наивный метод решения задачи, сгенерировать ответы для большого количества тестов на небольших ограничениях и немного помедитировать над ответами. Чтобы не занимать компьютер, лучше распечатать полученные результаты и медитировать уже над листочком.

Иногда полезно выводить не только сам ответ, но и какую-то дополнительную информацию, например, способ получения ответа.

Прием 8: "Гуглим"

Этот прием можно применять, только если правила раунда/контеста это разрешают. Если задача на последовательности, то можно поискать ответы (см. прием 7) на сайте https://oeis.org/. Полезно понять формальную модель задачи и гуглить по правильным математическим терминам.

Вопрос к знатокам

А какие общеприменимые приемы используете вы?

Полный текст и комментарии »

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

Автор MikeMirzayanov, история, 9 лет назад, По-русски

Добрый день!

Уже совсем скоро состоится финал RCC этого года. 19-го сентября финалисты сразятся за звание чемпиона Russian Code Cup и призовой фонд от Mail.Ru. К моему сожалению, финал опять будет не совсем онсайт. Как я понимаю будут организованы две крупные площадки: одна в офисе Mail.Ru, а другая в ИТМО. Те, кто не приедут участвовать с этих площадок, примут участие через интернет независимо.

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

Обычно, подобные трансляции проходят по какому-то такому сценарию:

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

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

Вопросы к вам:

  • какие из активностей во время трансляции наиболее интересны?
  • что не интересно?
  • что можно добавить?
  • как бы сделать так, чтобы было интересно и профессионалам и просто заинтересовавшимся?
  • нужны ли, вообще, эти трансляции?

Короче, буду рад мнениям и идеям.

Полный текст и комментарии »

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

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

Добрый день.

Закончилась летняя школа "Сазанка-2015", 13-го августа разъехались последние участники. Я надеюсь, что всем им понравились эти 10 дней на берегу Волги близ Саратова. Многие подходили, жали руку и говорили, что это так. Спасибо )

Пусть завидуют все те, кто не был с нами: за эти дни мы ударно и очень подробно прошлись по основным строковым алгоритмам, устроили чемпионат мира по ЧГК, ходили в сауну с уже классическими для этих сборов арбузами и мороженным, приняли участие в безумном Дне Нептуна. Еще были настолки, забеги в Волгу, песни под гитару и традиционные 20 килограмм шашлыка под занавес.

Но, конечно, главное — это была учебная программа. Мной были прочитаны четыре лекции, каждый день мы осчастливливали участников 5-ти часовыми контестами как тематическими, так и нет (один был 4-х часовым), а на разборах никто не засыпал. Спасибо моему напарнику по организации сборов Илье IlyaLos Лосю за подготовку контестов и проведение разборов.

Полный текст и комментарии »

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