Про сайт Codeforces
Если вы добрались до сюда, то вы уже довольно хорошо программируете, и имеет смысл не только решать задачи нашего курса, но также и дополнительно более-менее регулярно тренироваться. Рекомендую вам зарегистрироваться на сайте codeforces.com (есди он у вас вдруг открывается на английском языке, то в правом верхнем углу можно переключиться на русский), изучить его и время от времени принимать участие в его "раундах".
А именно, на этом сайте регулярно проводятся соревнования — "раунды". Они бывают в среднем раз в одну-две недели (каждый раунд писать не обязательно, но я бы вам рекомендовал хотя бы раз в месяц-полтора писать раунды). Это не какие-то призовые олимпиады и т.п., в них имеет смысл участвовать из интереса, и с целью тренировки. Раунды проводятся по разным правилам, ниже я опишу наиболее распространенный вариант.
Во-первых, у всех участников codeforces есть так называемый "рейтинг" — целое число, показывающее, насколько вы успешно выступали на раундах codeforces. Если вы хорошо выступаете, ваш рейтинг будет расти, если плохо, то падать. От рейтинга зависит цвет, которым ваш ник пишется на страничках codeforces. Кроме того, все участники codeforces делятся на два "дивизиона" по рейтингу. Вы изначально участвуете во втором дивизионе, если ваш рейтинг становится достаточно высоким (1700 и выше), то вы переходите в первый дивизион.
Раунды обычно проводятся отдельно по дивизионам. Наиболее часто проводятся два параллельных раунда — для первого и для второго дивизиона; задачи частично пересекаются, частично отличаются. Бывают объединенные раунды для двух дивизионов, бывают раунды только для второго дивизиона. Бывают раунды по совсем особым схемам и правилам. Большинство раундов являются "рейтинговыми", т.е. результаты участия в них влияют на ваш рейтинг, но бывают и "нерейтинговые" раунды. Обычно о рейтинговости раунда предупреждают заранее.
Наиболее часто раунды проводятся по следующим правилам. Для участия в раунде надо заранее зарегистрироваться на этот раунд (т.е. не просто зарегистрироваться на сайте, но еще и нажать специальную кнопку "зарегистрироваться на раунд"), обычно регистрация на раунд заканчивается минут за 5-10 до начала раунда. Раунд длится 2-2.5 часа. Вам предлагается 5 задач, упорядоченных по сложности (по крайней мере как думают авторы задач). У каждой задачи есть своя стоимость, определяющая количество баллов, которые вы получите при успешном решении этой задачи. У простых задач стоимость невысокая (обычно от 500), у сложных — высокая (обычно 2500). (Эти баллы не имеют прямого отношения к баллам рейтинга.)
Вы можете решать задачи в произвольном порядке (хотя обычно все решают от простых к сложным), на любых допустимых языках программирования. Когда вы считаете, что вы написали решение, вы можете его отправить на проверку (аналогично тому, как вы делаете на нашем сайте). Ваша задача будет проверена на так называемых "претестах" — некотором наборе тестов, который не обязательно является полным (т.е. вы можете пройти все претесты, даже если ваше решение не совсем правильное). Если ваше решение не прошло хотя бы один претест, оно не принимается, и вам об этом сообщают. Если оно прошло все претесты, то оно "принимается на окончательную проверку", которая будет проходить в конце раунда.
Если ваше решение не прошло претесты, вы можете его пересдавать. Если оно прошло все претесты, вы все равно можете его пересдать — если, например, вы нашли у себя ошибку. При этом за каждую лишнюю посылку вы впоследствии получите 50 штрафных баллов.
Стоимость задач падает со временем, к концу контеста опускаясь до примерно половины начальной стоимости. Соответственно, если в итоге окажется, что вы решили задачу, то вы получите столько баллов, сколько она стоила в момент вашей последней посылки, минус 50 баллов за каждую предыдущую посылку. В течение раунда вы можете смотреть его текущие результаты, т.е. кто что на данный момент решил.
Вдобавок ко всему этому, существует система "взломов". А именно, если ваше решение по некоторой задаче прошло претесты, вы можете его "заблокировать" (нажав на соответствующую кнопку в интерфейсе). После этого вы уже не можете перепосылать эту задачу, но зато вы получаете возможность смотреть исходные коды других участников по этой задаче (только те, что прошли претесты). Чтобы вам не возиться в огромной таблице результатов, все участники перед раундом псевдослучайным образом делятся по "комнатам", и вы можете просматривать решения только участников из своей комнаты. Чтобы просмотреть уод участника, надо сделать двойной щелчок по соответствующей ячейке в таблице результатов комнаты.
Цель просмотра решения — попробовать найти в нем ошибки. Если вы думаете, что вы нашли ошибку в решении, вы можете придумать тест, на котором, как вы думаете, это решение будет работать неправильно, и отправить этот тест в систему — попробовать "взломать" это решение. Система тут же проверит это решение на вашем тесте и, если оно действительно не работает, то вы получите плюс 100 баллов, если вы ошиблись, то вы получаете минус 50 баллов. В случае успешного взлома участник, которого взломали, это увидит, и (если он еще не заблокировал задачу) сможет перепослать свое решение. Если он уже заблокировал задачу, то ему не повезло. Соответственно, аналогично другие участники могут взламывать ваши решения; при этом, конечно, вы не видите тест, которым вас взломали.
При просмотре решения вы не можете куда-либо копировать его текст; вы должны смотреть код чисто глазами.
После окончания времени раунда все решения перетестируются на полноценном наборе тестов. Теперь если у вас все-таки было неверное решение, то оно почти наверняка не пройдет какой-нибудь из полноценных тестов. После этого вычисляются окончательные результаты. А именно, по каждой задаче, которую вы сдали, вам начисляются баллы, соответствующие стоимости задачи в тот момент, когда вы послали по ней последнее решение, минус 50 баллов за каждую предыдущую посылку по этой задаче. По тем задачам, которые вы так и не сдали, штрафные баллы не начисляются. Добавляются результаты взломов (100 баллов за успешный взлом, 50 баллов за неуспешный), и получается ваш итоговый балл, определяющий место, которое вы в итоге занимаете. От этого места зависит прирост вашего рейтинга.
После каждого раунда публикуются краткие разборы задач (в тот же день или через день-два). Рекомендую вам их читать. Кроме того, после окончания раунда вы все еще можете "дорешивать" — отправлять задачи на проверку просто чтобы дописать или исправить ошибки, которые у вас были. На результаты раунда это, конечно, не влияет, но все-таки разобраться в своих ошибках нужно.
Кроме того, на этом сайте есть много другой полезной информации. Во-первых, там есть функционал блогов, и пользователи часто пишут различные тексты и статьи на темы, связанные с программированием. На многих страницах сайта справа есть список постов, которые в данный момент обсуждаются. Во-вторых, на сайте есть раздел "тренировки", куда выкладываются задачи многих прошедших олимпиад; их можно самостоятельно решать в учебных целях.
Полезные ссылки
Общая справка по codeforcesПолные правила раундов