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

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

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

Занимаясь подготовкой VK Cup 2015, мы столкнулись с интересной задачей подсчета изменений рейтингов участников в командных контестах. Сразу скажу, что таковых будет немного, и значительного вклада они не должны внести.

Коротко напомню, что рейтинги Codeforces считаются примерно так:

  • у каждого участника есть какой-то рейтинг ri на начало раунда,
  • так как рейтинг Codeforces наследует идеологию рейтинга Эло, то мы стремимся к оценке, что участник b побеждает участника a с вероятностью:
  • зная вероятности микроматчей выиграть/проиграть для каждой пары участников, можно посчитать ожидаемое место участника i (как сумму вероятностей его проигрыша по всем остальным участникам),
  • если участник i занимает место лучше ожидаемого, то надо увеличить его рейтинг, иначе — уменьшить.

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

Кажется естественной идея распространить текущий подход на командное участие. Одна из проблем — отсутствие правила для вычисления рейтинга команды, если известны рейтинги ее членов. Если бы такое правило было, скажем какая-то функция teamRatings(r1, r2), то довольно логично использовать именно это значение для вычисления ожидаемого места, а потом одинаково изменить рейтинги участников команды в зависимости от того удачным было выступление (лучше ожидаемого места) или нет (хуже ожидаемого места).

Вот такая идея пришла в голову во время обеда команды Codeforces.

Во-первых, искомая функция teamRatings(r1, r2) от рейтингов членов команды должна быть такой, что teamRatings(r1, r2) ≥ max(r1, r2). Кроме того, понятно, что если к tourist-у добавить кого-то не очень сильного (скажем, зеленого участника), то рейтинг команды не должен сильно отличаться от рейтинга tourist-а.

Мной была предложена такая забавная модель. Пусть есть команда AB из двух участников A и B. Попробуем хоть как-то сравнить ее с одиноким участником C. В моей модели вместо командного контеста A + B против C проведем пару встреч A против C и B против C. Если хотя бы в одной из таких встреч победил член команды AB, то засчитаем победу команде, иначе — участнику C.

Конечно, такой подход не учитывает какой-то совместной работы A и B, но хотя бы честно пытается учесть шансы обоих победить C. Если все три рейтинга известны, то легко посчитать вероятность победы C — это произведение вероятностей победить A и победить B. Просто дважды применим формулу Эло и перемножим результаты.

Теперь, когда известен рейтинг C и рейтинг его победы над командой, то, обратив формулу Эло, можно посчитать рейтинг команды.

Есть тонкость, что при таком подсчете рейтинг команды зависит от рейтинга противника C. Как же его выбрать? Можно показать, что при изменении C, результат меняется монотонно. Кажется красивой идея выбрать такое C, чтобы рейтинг команды в конце концов оказался ему и равен. То есть, в качестве противника команде подобрать такого, который играет с командой на равных. Это можно сделать бинпоиском, хотя, наверное, можно и вывести точную формулу (кто поможет?).

В результате получается примерно такой код:

long double getWinProbability(long double ra, long double rb) {
    return 1.0 / (1.0 + pow((long double) 10.0, (rb - ra) / 400.0));
}

long double aggregateRatings(vector<long double> teamRatings)
{
    long double left = 1;
    long double right = 1E4;

    for (int tt = 0; tt < 100; tt++) {
        long double r = (left + right) / 2.0;

        long double rWinsProbability = 1.0;
        forn(i, teamRatings.size())
            rWinsProbability *= getWinProbability(r, teamRatings[i]);

        long double rating = log10(1 / (rWinsProbability) - 1) * 400 + r;

        if (rating > r)
            left = r;
        else
            right = r;
    }

    return (left + right) / 2.0;
}

Полный код можно посмотреть найти по ссылке http://pastebin.com/HnteNGuN

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

Вот интересные примеры:

Первый член команды Второй член команды Итоговый рейтинг
tourist, 3239 Petr, 3045 3314
tourist, 3239 niyaznigmatul, 2700 3253
tourist, 3239 tourist, 3239 3392
Petr, 3045 Petr, 3045 3198
tourist, 3239 Bredor, 1766 3239
Bredor, 1766 Bredor, 1766 1919

Или вот еще интересное следствие: команда из 3350-ти Бредоров будет решать как tourist.

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

Буду рад альтернативным моделям агрегирования рейтингов.

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

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

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

523A - Rotate, Flip and Zoom

Это была несложная задача на технику работы с двумерными массивами. Для решения задачи можно было честно последовательно проделать все три операции или заметить, что первые две (поворот + отражение) совместно дают простую транспозицию (отражение относительно главной диагонали, когда клетка с координатами (i, j) отображается на клетку с координатами (j, i)). Поэтому для вывода ответа было достаточно сделать два цикла (используется 0-индексация и псевдоязык):

for i = [0...2*a-1] begin
  for j = [0...2*b-1] begin
    print(a[i / 2][j / 2])
  end
  вывести перевод строки
end

Пример решения: 10286345.

523B - Mean Requests

Подсчет приближенного среднего подробно описан в условии задачи (даже приведен псевдокод). В самом деле при его подсчете надо было просто следовать описанным правилам подсчета.

Для подсчета среднего на отрезках длины T достаточно знать значение суммы элементов на отрезках длины T (для получения среднего надо просто значение суммы делить на T). Если это делать наивным способом, подсчитывая сумму каждый раз в цикле заново, то получается неэффективный медленный алгоритм. В самом деле, при T = n / 2 и наборе из m = n запросов n / 2 + 1, n / 2 + 2, ..., n такой алгоритм суммарно выполнит около n2 / 4 действий. Для заданного максимального значения n эта величина будет слишком большой для вычисления в 4 секунды.

Для ускорения подсчета суммы на отрезках длины T можно либо поддерживать эту сумму, тогда при перемещении старта такого отрезка с индекса i на индекс i + 1 сумма изменяется следующим образом: sum:  = sum - a[i] + a[i + T]. Таким образом, пересчет суммы от предыдущего положения старта отрезка до нового будет работать за одну формулу (ограниченное сверху некоторой константой количество действий).

Второй вариант как быстро находить суммы на отрезках состоит в подсчете вспомогательного массива частичных сумм. Пусть b[i] — сумма первых i элементов массива a. Тогда сумма элементов массива a на отрезке от l до r равна b[r + 1] - b[l] (если массив a 0-индексирован). Подсчет массива b можно осуществить за один проход слева направо по формуле b[i] = b[i - 1] + a[i - 1].

Пример решения: 10291184.

523C - Name Quest

Наивный способ решения задачи (перебрать разрез и проверить "хорошесть" каждого из них) работает за квадратичное время и недостаточно эффективен, чтобы решение прошло.

Посчитаем две позиции:

  • такую минимальную позицию l, что подстрока t[1..l] хорошая, тогда очевидно, что любой разрез за позицией l будет таким, что левая часть "хорошая",
  • такую максимальную позицию r, что подстрока t[r..|t|] хорошая, тогда очевидно, что любой разрез перед позицией r будет таким, что правая часть "хорошая".

Каждую из величин l и r можно найти жадным образом просто итерируясь до вхождения очередной буквы и продолжая поиск следующей. Вот пример возможного кода для поиска l:

j := 1
for i := 1 to |t|
    if j <= |s| && s[j] == t[i]
        j = j + 1
        if j = |s| + 1
            l := i

Для того, чтобы после разреза обе части содержали s необходимо и достаточно, чтобы разрез проходил между l и r. Таким образом, ответ равен r - l или 0, если l или r не нашлось или r < l.

523D - Statistics of Recompressing Videos

Для эффективной реализации алгоритма моделирования процесса необходимо хранить в какой-то структуре h отсортированные моменты освобождения каждого из серверов. Сначала h состоит k единиц.

Будем обрабатывать ролики последовательно в хронологическом порядке. Для того, чтобы начать обрабатывать очередной i-й надо дождаться освобождения какого-либо сервера. Пусть ролик приходит в момент si и имеет длительность ti.

Очевидно, что можно ждать освобождения до первого из моментов из h (так как первый — минимальный). Возможно, что дожидаться в явном виде и не надо, так как сервер уже освобождается к моменту si, в любом случае можно считать, что ролик надо отправить на первый из серверов, который освободиться. Пусть минимальный элемент из h равен h0, тогда ролик начнется обрабатываться в момент max(h0, si), а закончит к моменту max(h0, si) + ti. Для поддержания структуры h надо исключить из нее h0 и добавить max(h0, si) + ti. Таким образом, в h по прежнему будут все моменты освобождения серверов.

Для того, чтобы решения быстро работали, h надо хранить в подходящей структуре данных. Это может быть очередь с приоритетами (тогда минимум будет в голове), либо в упорядоченном множестве. Так как в h могут быть равные элементы, то эта структура либо должна работать с одинаковыми элементами (как очередь с приоритетами или мультимножество по типу std::multiset в C++) или надо в структуре хранить пары (момент освобождения, номер сервера).

Кроме того в качестве h можно использовать классическую бинарную кучу или упорядоченный ассоциативный массив (TreeMap в Java).

Такое решение будет работать за .

Пример решения: 10290987. В этом решении в очереди с приоритетами q моменты хранятся со знаком минус, чтобы сортировка по-умолчанию ставящая максимум вперед, ставила вперед минимум.

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

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

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

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

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

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

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

В Раунд 1 пройдут все те команды, которые набрали положительный балл и одновременно не меньший, чем у 500-го места.

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

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

Результаты раунда не будут влиять на рейтинг. Уже прошедшие в Раунд 1 команды, могут участвовать в Квалификации 2 вне конкурса. Они никак не влияют на отбор участников в Раунд 1, они могут участвовать только just for fun. Внеконкурсное участие тоже требует соблюдение всех правил, в случае нарушения команда может быть дисквалифицирована с Чемпионата.

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

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

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

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

522A - Reposts

Для решения этой задачи надо было проитерироваться по записям о репостах и поддерживать для каждого пользователя длину цепочки, которая заканчивается в нем. Здесь удобно воспользоваться ассоциативным массивом из строки (имени пользователя) в целое число (длину цепочки). Например, для С++ такой структурой данных будет просто map<string,int>. Назовем такую структуру chainLengths, тогда при обработки строки вида <<a reposted b>> надо просто выполнить присвоение chainLengths[a] = chainLengths[b] + 1. В качестве ответа надо вывести максимальное из значений chainLengths, что можно подсчитывать на лету.

Пара тонкостей: в начале надо занести chainLengths["polycarp"] = 1;, а всюду при работе со строками приводить их к нижнему регистру (или верхнему), чтобы сделать сравнение строк нечувствительным к регистру букв.

Пример такого решения: 10209456.

522B - Photo to Remember

В этой задаче для каждого i фактически надо было найти:

  • Wi, равное сумме всех заданных wj без wi,
  • и Hi, равное максимуму всех hj без hi.

Для подсчета первой величины достаточно найти сумму s всех значений wj, тогда Wi = s - wi.

Для подсчета второй величины достаточно заметить, что либо искомое значение есть просто максимум по h, либо (если hi совпало с максимумом) это второй максимум (т.е. предпоследний элемент при сортировке по неубыванию). Второй максимум, как и максимум ищется за один проход по массиву.

В таком случае, для нахождения как Wi, так и Hi требуется O(1) действий, то есть O(n) суммарно на всё решение.

Пример решения: 10193758.

522C - Chicken or Fish?

Для решения задачи необходимо заметить, что при наличии недовольных пассажиров (т.е. тех, для кого ri = 1), существенную роль играет только первый из них, так как остальные вполне могут быть недовольными именно тем блюдом, которое не хватило первому из таковых.

Пусть массив b — это массив максимальных возможных количеств порций каждого из блюда на момент старта обслуживания Поликарпа. То есть просто массив b надо заинициализировать массивом a, а каждый раз, когда ti отлично от 0, то делать b[ti] = b[ti] - 1 (уменьшать количество порций блюда). Кроме того, пусть unknown — это количество пассажиров, про которых неизвестно какие точно блюда им достались (то есть для них ti = 0). Пусть величина unknownBeforeUpset — это такое же количество, но до первого недовольного.

Таким образом, есть два основных случая:

  • недовольных пассажиров нет вообще, тогда блюдо i могло закончится тогда и только тогда, когда b[i] ≤ unknown (жадно отдаем это блюдо всем пассажирам, для кого их точное блюдо неизвестно),
  • недовольный пассажир есть, этот случай разберем подробнее.

Каким блюдом мог быть недоволен первый из таких пассажиров? Очевидно из списка кандидатов надо выкинуть все такие блюда, которые упоминаются не раньше него (значит, что они закончится до него не могли). Из оставшегося набора блюд достаточно перебрать все блюда и проверить могли ли они закончиться до этого пассажира. То есть блюдо i могло быть тем блюдом, что привело в недовольство первого недовольного, если одновременно верно:

  • это блюдо i не упоминается на этом пассажире или позже,
  • это блюдо i такое, что b[i] ≤ unknownBeforeUpset.

Для всех таких блюд, очевидно, в ответе должно стоять Y (они могли закончится к Поликарпу). Кроме того, из всех таких блюд наибольшую степень свободы дает блюдо с наименьшим расходом (количеством порций b[i]). Выберем именно такое блюдо и в остаток пассажиров с неизвестным блюдом restUnknown = unknown - b[minFirstFinished] попробуем поместить все вхождения каждого из других блюд. То есть блюдо j могло закончится до Поликарпа тогда и только тогда, если для него b[j] ≤ restUnknown (то есть закончилось то блюдо, что расстроило первого из недовольных, а следом — j-е).

Такое решение работает за O(m + k).

Пример решения: 10212686.

522D - Closest Equals

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

Пройдем слева направо по массиву и составим новый массив b, записав в b[j] расстояние до ближайшего слева парного j-му элементу значения, то есть a[j - b[j]] = a[j]. Если такового нет, то запишем в ячейку бесконечность.

Эти значения соответствуют расстояниям между парными элементами и записаны они в позициях правых элементов в этих парах.

При рассмотрении запроса на отрезке [l, r] нам не нужны вообще такие пары, что начинаются левее l, а минимум надо искать среди пар, что заканчиваются не правее r.

Отсортируем все запросы по l слева направо. Тогда при прохождении по запросам можно поддерживать, что для запроса [l, r] в массиве b установлены бесконечности для всех пар, в которых левый элемент левее l. Для этого просто предподсчитаем для каждого элемента ближайший справа парный next[i] (то есть верно, что b[next[i]] = next[i] - i), и при покидании ячейки i будем записывать в b[next[i]] значение бесконечность.

В таком случае, для ответа на запрос [l, r] надо просто найти минимум на префиксе до индекса r включительно по массиву b. Это можно делать быстро разными способами (дерево отрезков, дерево Фенвика).

Асимптотическая временная сложность такого решения составляет .

Пример решения: 10192075.

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

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

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

Всем привет!

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

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

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

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

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

Пользуясь случаем поздравляем всех девушек-участниц с праздником. Спасибо вам за весну!

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

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

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

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

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

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

Добрый день, Codeforces!

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

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

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

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

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

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

Добрый день, Codeforces!

Я с радостью сообщаю, что озвученную поддержку в $10000 удалось собрать чуть более чем за трое суток! Спасибо большое, друзья!

Эта хорошая новость означает, что теперь у нас есть возможность сделать рывок следом за курсом доллара и выплачивать в рублях эквивалентные суммы авторам раундов!

Тип раунда $ рубли
Div 1 + Div 2 $250+*$50 18000 руб.
Div 2 $100+*$50 9000 руб.

Рублевые выплаты мы привязываем к курсу ЦБ РФ на день раунда, округленный к ближайшему кратному 5 числу рублей по правилам математического округления. В таблице указаны значения, актуальные для даты публикации поста. Звездочкой отмечен бонус, который выдается в случае образцовой подготовки раунда.

И это еще не все! Как и было заявлено теперь у нас есть возможность в достаточной степени поддерживать координатора задач Codeforces Максима Zlobober Ахмедова. К этой роли он приступил осенью 2014-го и под его руководством уже поведены более двух десятков раундов. Подготовка раундов — большая работа, и он отлично с ней справляется. Я надеюсь на нашу продолжительную и эффективную работу вместе.

Чтобы вы лучше познакомились с Максимом я попросил его написать несколько слов о себе и вот что получилось.

Привет!

Обо мне — закончил СУНЦ МГУ им. А. Н. Колмогорова, съездил школьником на IOI 2012, взял золотую медаль и абсолютное седьмое место в составе сборной России. Из самых крупных последних достижений — 5 место Russian Code Cup 2014, 10-е место в 2013-м и 3-е в 2014-м году на NEERC в составе команды Moscow SU Trinity. Победитель всесибирской олимпиады Поттосина 2013 года и кубка ICL 2014 года в составе той же команды.

Люблю музыку, слушаю разный тяжёлый и не очень рок, хожу на концерты. Сам играю на разных музыкальных инструментах. Член жюри многих школьных олимпиад по программированию. Последняя прочитанная книга — Пелевин, "Чапаев и Пустота". Любимый фильм назвать трудно — люблю фильмы Квентина Тарантино, Роберта Родригеса и Кристофера Нолана.

Как-то так.
Макс.

Кроме того, собранные средства позволят чуть лучше поощрять нашу замечательную переводчицу Марию Delinur Белову, которая будучи филологом уже столько перевела задач, что порой правит ошибки в формулах в условиях :)

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

Все собранные дополнительные средства пойдут на развитие и поддержку Codeforces, а именно (при условии достаточного собранного бюджета):

  • нарастим гонорары по Div1+Div2 раундам — пусть их будет больше!
  • в команде появится специалист по контенту: будет регулярно добавлять и систематизировать тренировки, возможно, статьи;
  • нам скоро обязательно понадобится и мы сможем расширить железо;
  • усилим команду разработчиков, чтобы больше вас радовать нововведениями!

Спасибо за поддержку, Михаил Мирзаянов

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

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

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

Hi Codeforces!

The VK company (vk.com), the largest social network in Europe and the most popular site in Russia and Ukraine, announces the competition for russian-speaking programmers VK Cup 2015.

As you can see, the reborn VK Cup is focused on Russian-speaking programming lovers. Indeed, the whole VK developer team speaks Russian, most social network users communicate in Russian and the head office of the company is located in St. Petersburg. Those are the reasons we decided to concentrate on the competition for russian-speaking participants — most of the social network code is written by medal winners and ACM-ICPC finals champions. We believe that when we support the enthusiasm of young people towards solving problems and studying algorithms, that we make the world better and invest for the future of our company.

That is not the only innovation of the championship: unlike many other championships conducted by companies, VK Cup 2015 will have two-man teams competing with each other, the participants’ age ranges from 14 to 23 years.

Though we focus on the Russian-speaking participants, we are happy to share our problems and rounds with the participants from the whole world. For that reason, all problems of the championship will be translated into English and will be available to solve after the official championship rounds are over. Besides, in some rounds the participants from around the world can take part unofficially, side by side with the official championship contestants. We will be happy to give out 50 brand T-shirts of the Championship to the best out of competition unofficial participants of Round 3. We will be happy to see interest towards the problems of our championship!

VK Team

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

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

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

Привет, друзья!

Да-да, именно к друзьям Codeforces я хочу сейчас обратиться. Совсем недавно Codeforces исполнилось 5 лет, и по этому случаю мы открываем кампанию по сбору средств на работу и развитие Codeforces.

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

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

Михаил Мирзаянов

UPD: У нас отличные новости!

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

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

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

Привет, Codeforces!

Рад представить вам PyPy на Codeforces. Прошу любить и жаловать.

Хорошие новости состоят в том, что JIT в самом деле работает — PyPy зачастую оказывается существенно быстрее классического Python. Похоже, что обычно PyPy быстрее в 2-60 раз. Например, PyPy 2 показывает 60 кратный прирост производительности на binary-heap-benchmark, а PyPy 3 — 85-ти кратный.

Кроме того у PyPy хорошая совместимость с Python, то есть в большинстве случаев вы можете просто отправить программу на PyPy.

Не уходите далеко — скоро вас ждут еще хорошие новости :)

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

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

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

Добрый день.

В конце декабря-начале января я писал прототип отдельного сервиса на C++, чтобы вынести из Java-кода Codeforces тяжелые данные в С++. Давненько я не писал на C++, испытал забавные ощущения погружения в другой мир.

С удивлением обнаружил отсутствие в C++ хэш-мэпа с открытой адресацией в стандартной библиотеке, как впрочем и в boost-e, как впрочем и других нормальных библиотеках. Даже странно как-то, ведь правда же довольно часто открытая адресация будет делать разрешение коллизий цепочками как по времени, так и по памяти. А так как я предполагаю хранить мелкие объекты, то и наверняка.

Я быстренько набросал прототип, который в самом деле показывает, что открытая адресация в раза 2-3 работает быстрее стандартного unordered_map, так что такой контейнер, наверняка, имеет смысл. Вот вывод бенчмарка на моём ноуте:

std::map takes 15779 ms
std::unordered_map takes 4698 ms
oaht::hash_map takes 1473 ms

Мне кажется, что нормальной реализации в stl-стиле с поддержкой С++11 (move semantics) нет. Может кто-то покажет, но я не нашел.

Вот мой прототип на github: https://github.com/MikeMirzayanov/open_addressing_hash_table К сожалению, я не крутой эксперт C++, и со временем у меня совсем не круто, так что довести до ума такой контейнер в обозримом будущем не получится.

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

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

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

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

Здравствуй, 2015! Добрый день, Codeforces!

На календаре 2-е января, а значит оливье почти съедено. Итоги 2014-го года я как обычно подведу тезисно, без этого "коротенько, минут на сорок".

Честно говоря я почти опасался начинать подводить статистику 2014-го года, ведь в 2013-м году Codeforces показал настолько стремительный рост, что было бы неудивительно выглядеть бледненько на его фоне. Как бы не так! Я был приятно удивлен цифрам и отчетам!

Чуть ниже будет список основных событий и достижений Codeforces за прошедший год. Для вас это просто список, но обратите внимание — за каждым пунктом кроется напряженная многодневная работа команды Codeforces, авторов задач, организаторов контестов и турниров, помощь тестов и волонтеров. Ура! Мы вместе сделали всё это (а список неполный, много что просто опущено):

  • разработан и открыт Codeforces API
  • добавлены (и местами переработаны) все контесты Андрея andrewzta Станкевича
  • режим работы Codeforces в виде iframe-виджета и поддержка задач-вопросов позволили помочь Google провести https://www.calltocode.ie/ для школьников Ирландии,
  • почти 70 раундов для наших любимых пользователей
  • почти 450 новых интересных задач подготовлены для раундов и соревнований на платформе Codeforces
  • поддержаны новые языки программирования
  • совместно с КРОК провели Coder-Strike 2014 (всех порвал Никита -imc- Уваров)

  • провели незабываемый Первоапрельский контест 2014 от великолепной Марии Nickolas Михайловой
  • совместно с жюри Russian Code Cup провели RCC 2014 Warmup, который открыл RCC для широкого круга пользователей Codeforces
  • площадка Codeforces выступила пресс-партнером RCC, ACM-ICPC финала в Екатеринбурге, Яндекс.Алгоритма
  • провели ZeptoLab Code Rush 2014 с клевыми задачами и Ом-Номами
  • помогли замечательной компании RocketFuel провести Rockethon 2014 (конечно, у нас)
  • на нашей площадке состоялся MemSQL Start[c]UP 2.0 с финалом в офисе MemSQL!
  • провели 11 эпизодов второго сезона тренировок Codeforces
  • совместно с жюри Bayan Contest провели Bayan Contest Warm Up
  • обновили Полигон (http://polygon.codeforces.com/) внедрив бесконечное множество небольших улучшений
  • поддержали разборы задач в Полигоне
  • кэширование запросов к файловой системе в в Полигоне привело к заметному ускорению работы большинства страниц редактирования задачи
  • вместе с GridDynamics провели пилотный GridGames (для студентов Саратова)
  • побиты все рекорды: 6274 регистрации на предновогодний контест Good Bye 2014

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

А вот и сравнение с прошлыми годами работы Codeforces. Наглядно. В картинках.

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

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

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

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

UPD: Новогодние праздники подходят к концу, магия рассеиваются. В эти праздники волшебной возможностью воспользовались 7482 раз. А вот статистика по цветам, в которые происходили превращения.

цвет количество
red 3044
gray 1652
orange 940
green 817
blue 528
violet 501

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

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

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

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

Хэндл можно сменить либо на совсем новый (ранее никем никогда не используемый), либо на тот, который у вас был когда-то ранее. И да, совсем скоро странички вида http://mirror.codeforces.com/profile/Alex_KPR будут автоматически редиректить со старого хэндла на новый. У нас все ходы записаны!

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

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

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

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

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

Добро пожаловать на 2014-2015 CT S02E11: Codeforces Trainings Season 2 Episode 11 (2011-2012 ACM-ICPC Latin American Regional Contest + Extended). Продолжительность тренировки — 5 часов. Тренировка открыта как для команд, так и для индивидуальных участников. После ее окончания вы можете дорешивать задачи тренировки или поучаствовать в ней виртуально, если не смогли принять участие одновременно со всеми. Пожалуйста, участвуйте в тренировке честно.

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

Условия задач будут на английском языке, ведь мы же готовимся к ACM-ICPC!

Удачи!

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

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

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

С виду оно не заметно, но за последние дни в недрах бэкэнда Codeforces произошли заметные изменения, призванные улучшить производительность и стабильность. Теперь мы хотим проверить перед предстоящим раундом, что все работает как надо.

Приглашаем вас принять участие в Testing Round 11. Старт состоится ночью в 00:30. Раунд будет неофициальным, нерейтинговым.

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

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

Спасибо.

UPD: Спасибо, что приняли участие!

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

Анонс Testing Round 11
  • Проголосовать: нравится
  • +100
  • Проголосовать: не нравится

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

Добро пожаловать на 2014-2015 CT S02E10: Codeforces Trainings Season 2 Episode 10 - 2014 Amirkabir University of Technology Annual Programming Contest (AUT APC 14). Продолжительность тренировки — 5 часов. Тренировка открыта как для команд, так и для индивидуальных участников. После ее окончания вы можете дорешивать задачи тренировки или поучаствовать в ней виртуально, если не смогли принять участие одновременно со всеми. Пожалуйста, участвуйте в тренировке честно.

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

Условия задач будут на английском языке, ведь мы же готовимся к ACM-ICPC!

Удачи!

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

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

Автор MikeMirzayanov, 11 лет назад, По-английски

489A - SwapSort

All you need is to swap the current minimum with the i-th element each time. You can do it with the code like:

    for (int i = 0; i < n; i++)
    {
        int j = i;
        for (int t = i; t < n; t++)
            if (a[j] > a[t])
                j = t;
        if (i != j)
            answer.push_back(make_pair(i, j));
        swap(a[i], a[j]);
    }

This solution makes at most n-1 swap operation. Also if (i != j) is not necessary.

489B - BerSU Ball

There are about 100500 ways to solve the problem. You can find maximal matching in a bipartite graph boys-girls, write dynamic programming or just use greedy approach.

Let's sort boys and girls by skill. If boy with lowest skill can be matched, it is good idea to match him. It can't reduce answer size. Use girl with lowest skill to match. So you can use code like:

sort(boys.begin(), boys.end());
sort(girls.begin(), girls.end());

for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
        if (abs(boys[i] - girls[j]) <= 1)
        {
            girls[j] = 1000;
            result++;
            break;
        }

489C - Given Length and Sum of Digits...

There is a greedy approach to solve the problem. Just try first digit from lower values to higher (in subtask to minimize number) and check if it is possible to construct a tail in such a way that it satisfies rule about length/sum. You can use a function `can(m,s)' that answers if it is possible to construct a sequence of length m with the sum of digits s:

bool can(int m, int s)
{
    return s >= 0 && s <= 9 * m;
}

Using the function can(m,s) you can easily pick up answer digit-by-digit. For the first part of problem (to minimize number) this part of code is:

    int sum = s;
    for (int i = 0; i < m; i++)
        for (int d = 0; d < 10; d++)
            if ((i > 0 || d > 0 || (m == 1 && d == 0)) && can(m - i - 1, sum - d))
            {
                minn += char('0' + d);
                sum -= d;
                break;
            }

The equation (i > 0 || d > 0 || (m == 1 && d == 0)) is needed to be careful with leading zeroes.

489D - Unbearable Controversy of Being

Let's iterate through all combinations of a and c just two simple nested loops in O(n2) and find all candidates for b and d inside. To find candidates you can go through all neighbors of a and check that they are neighbors of c. Among all the candidates you should choose two junctions as b and d. So just use https://en.wikipedia.org/wiki/Combination All you need is to add to the answer , where r is the number of candidates (common neighbors of a and c). The code is:

    for (int a = 0; a < n; a++)
        for (int c = 0; c < n; c++)
            if (a != c)
            {
                int r = 0;
                for (int b = 0; b < nxt[a].size(); b++)
                    if (nxt[a][b] != a && nxt[a][b] != c && g[nxt[a][b]][c])
                        r++;
                result += r * (r - 1) / 2;
            }

It is easy to see that the total complexity is O(nm), because of sum of number of neighbors over all junctions is exactly m.

P.S. I'll be grateful if some of you will write editorial of E and F in comments because of now I should leave Codeforces and will return back some hours later. Thank you for participation!

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

Разбор задач Codeforces Round 277.5 (Div. 2)
  • Проголосовать: нравится
  • +114
  • Проголосовать: не нравится

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

Добрый день, Codeforces!

Как-то даже я сам не понял как, но я вдруг взял и подготовил раунд для второго дивизиона. Мне кажется, это подсознание захотело как-то еще смягчить воспоминания о раунде 276.

Я очень надеюсь, что раунд пройдет на ура, как и прошел 277-й — без каких-либо нареканий на работу системы.

Выражаю искренние слова благодарности всем задействованным в подготовке — Максиму Zlobober Ахмедову, Марии Delinur Беловой, Полигону, серверам и Джеймсу Гослингу за Java. Еще я безмерно благодарен тому водителю, который меня всё-таки сегодня не задавил, хотя я, задумавшись о задачах, шел на красный.

Раунд будет рейтинговым, задач будет 6, а разбалловка — неклассической min(500 + i*500, 2500).

Удачи!

UPD.: Раунд передвинут на 5 минут вперед — мне очень хочется, чтобы все, кто хочет принять участие, успели на него. Извините.

UPD 2.: Рейтинг предварительно обновлен. Найдем читеров — применим меры, обновим еще раз. Спасибо за участие!

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

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

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

Добро пожаловать на 2014-2015 CT S02E09: Codeforces Trainings Season 2 Episode 9 - 2006-2007 ACM-ICPC Northeastern European Regional Contest (NEERC 06). Продолжительность тренировки — 5 часов. Тренировка открыта как для команд, так и для индивидуальных участников. После ее окончания вы можете дорешивать задачи тренировки или поучаствовать в ней виртуально, если не смогли принять участие одновременно со всеми. Пожалуйста, участвуйте в тренировке честно.

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

Условия задач будут на английском языке, ведь мы же готовимся к ACM-ICPC!

Удачи!

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

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

Автор MikeMirzayanov, 11 лет назад, По-английски

Hello,

I'm really starting to think that plans to host ACM-ICPC World Finals bring misfortune. ACM-ICPC World Finals 2011 initially were planned to be in Egypt, but revolution has changed plans.

What do you think about chance to drop World Finals in Morocco because of Ebola Virus?

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

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

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

Добро пожаловать на 2014 Benelux Algorithm Programming Contest (BAPC 14), 2014-2015 CT S02E08: Codeforces Trainings Season 2 Episode 8. Продолжительность тренировки — 5 часов. Тренировка открыта как для команд, так и для индивидуальных участников. После ее окончания вы можете дорешивать задачи тренировки или поучаствовать в ней виртуально, если не смогли принять участие одновременно со всеми. Пожалуйста, участвуйте в тренировке честно.

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

Условия задач будут на английском языке, ведь мы же готовимся к ACM-ICPC!

Удачи!

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

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

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

Привет, Codeforces.

Уверен, многие в курсе — просто напомню. Polygon — это сервис для подготовки задач по программированию. Обычно используется в подготовке к олимпиадам, но часто и для учебных задач по информатике. Расположен он по адресу https://polygon.codeforces.com/ и открыт для всех желающих.

Я недавно обнаружил, что вот уже прошло более 5-ти лет как была создана система разработки задач Polygon. Самое время обобщить накопленный опыт использования.

Впервые о Polygon я публично рассказал в узком коллективе тренеров российских сборных на финале ACM-ICPC в 2009-м году. Я не скажу, что все восприняли разработку с энтузиазмом, были и те, кто высказал откровенный скепсис жизнеспособности и востребованности такой системы. Прошло 5 лет и на финале ACM-ICPC в Екатеринбурге Олег Христенко (человек-Снарк) сказал, что считает создание Polygon моей большей заслугой, чем Codeforces. Я, конечно, был удивлен, но Полигону это передал :-)

К началу работы над Полигоном (а это была осень 2008-го года) я приступил с точным осознанием необходимости подобной системы. К тому времени я уже был опытнейшим автором задач для большого количества контестов — бесконечное количество школьных Саратовских олимпиад, четвертьфиналы ACM-ICPC, мои задачи были на ВКОШП, РОИ, полуфинале ACM-ICPC NEERC, на финале TopCoder Open и еще много где. В большинстве случаев задачи разрабатывались в системе контроля версий, были разложены по папочками и структурировались какими-то полуформальными негласными правилами именования.

Ниже я попробую тезисно сформулировать, почему использование Полигона это хорошо, а неиспользование — плохо.

1. Полигон защищает от ошибок

В Полигон встроено множество средств автоматизации и самопроверки. Несколько примеров:

  • вам будет трудно опечататься в тесте из условия или забыть его актуализировать после изменения тестов, так как он вставляется автоматически, а ответ генерируется системой авторским решением;
  • вам будет трудно оставить в архиве некомпилирующееся решение (даже опытные команды типа ИТМО регулярно оставляют в архиве решения на Java, где имя класса не совпадает с именем файла);
  • вам будет трудно забыть сделать первый тест тестом из условия, Полигон покажет вам предупреждение;
  • вам будет трудно написать генератор, который инициализируется от времени и поэтому при последовательных запусках выводит разные тесты, Полигон запустит генератор пару раз с интервалом в секунду и проверит совпадение тестов.

2. Архивы (пакеты) задач Полигона единообразны и машиночитаемы

Поразительно, но олимпиадное сообщество за более чем 20 лет активного развития так и не стандартизовало способ распространения задач. Задачи из Полигона имеют одинаковый и логичный способ организации файлов и являются машиночитаемыми. Файл problem.xml содержит не только базовую мета-информацию вроде ограничений на время и память, но и в деталях всё что понадобится для последующей автоматизированной работы над задачей.

Вот несколько примеров:

  • для TL указан тип процессора, для которого он был выбран;
  • явно указан способ ввода-вывода и имена файлов, если таковые используются;
  • название задачи с поддержкой многоязычности;
  • точный способ генерации каждого из генерируемых тестов;
  • теги решений (например, заведомо медленное решение, может быть помечено тегом time-limit-exceeded);
  • точные пути до тестов и прочих ресурсов.

Мне не известны другие используемые настолько полные машиночитаемые форматы дескрипторов.

3. Полигон берет на себя долговременное хранение и доступность

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

Что же обычно происходит, если Полигон не используется? На время разработки олимпиады поднимается сервер системы контроля версий, обычно потом он гасится, остается только архив: теряется история правок, доступы на разработку, автоматизация запусков и других действий.

4. Полигон сокращает порог вхождения в процесс подготовки задач

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

Если Полигон не используется, то процесс обычно регулируется системой негласных правил (медленное решение называйте с суффиксом _slow, ну или _tl), неопытному участнику непонятно с чего начинать и как. Кроме того, обычно требуются знания основ работы с svn и командной строкой, а работа для пользователей Windows и Linux различается.

5. Полигон помогает управлять доступом

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

6. Полигон имеет issue-tracking

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

7. Полигон легко интегрируется с тестирующими системами

Полигон предоставляет машиночитаемые пакеты задач с подготовленными тестами (как для Windows, так и для Linux), так и с возможностью их сгенерировать при разворачивании пакета. Полигон имеет простой HTTP POST-based API для доступа к данным. При формировании POST-запросов надо передавать параметры login и password пользователя (и опционально revision).

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

8. Без Полигона требуется специальный софт на компьютере разработчика

Например, разработчику на Windows может понадобиться bash, чтобы запустить doall.sh, генерирующий все тесты. Или Java-программист будет вынужден поставить C++, чтобы скомпилировать чекер. Для компилирования условия ставьте LaTeX.

Полигон избавляет от всего этого, многое делается на стороне сервера.

9. Полигон безопаснее большинства альтернативных способов совместной разработки

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

10. Полигон классифицирует и индексирует задачи

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

The End

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

Вывод простой. Каждый раз, когда вы создаете задачу не в Полигоне, то бог убивает котенка.

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

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

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

Добро пожаловать на 2014-2015 CT S02E07: Codeforces Trainings Season 2 Episode 7. Продолжительность тренировки — 5 часов. Тренировка открыта как для команд, так и для индивидуальных участников. После ее окончания вы можете дорешивать задачи тренировки или поучаствовать в ней виртуально, если не смогли принять участие одновременно со всеми. Пожалуйста, участвуйте в тренировке честно.

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

Условия задач будут на английском языке, ведь мы же готовимся к ACM-ICPC!

Удачи!

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

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

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

Соревнование было перенесено в тренировки.

Завтра состоится четвертьфинал ACM-ICPC Южного подрегиона NEERC (2014). Жюри надеется на интересную борьбу, участники — на достойные результаты. Что же, завтра увидим.

А уже в ближайшую субботу (25-го октября) в 11:00 состоится онлайн-трансляция этого соревнования: 2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred). Вас ждут интересные задачи, которые жюри постаралось сделать интересными как для начинающих, так и опытных участников.

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

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

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

На закуску — виды Саратова:

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

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