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

Автор VladKov, 4 года назад, По-русски

Привет! При подготовке к школьным олимпиадам (например, Высшая проба, Ломоносов, ИОИП) затруднительно найти тренировку с возможностью дорешать задачи. Их просто нет.
В случае цикла интернет олимпиад и ИОИП тренировки за текущий год стали выкладывать, но предыдущие года отсутствуют, за исключением нескольких штук.
Большое количество школьников (в числе которых был и я, пока не потратил пару часов на изучение платформы Polygon, спасибо за нее MikeMirzayanov) не в курсе того, как загрузить архив олимпиады на Polygon. Такой вывод я сделал когда видел подобные вопросы в тематических беседах. Поэтому я посчитал что будет полезно поделиться этими знаниями.
Данный пост будет полезен скорее новичкам (хотя в числе спрашивающих было несколько кандидатов в мастера), остальные же не найдут ничего нового, и даже наоборот, уверен, поправят меня :)

Что понадобится

Архив олимпиады с тестами, чекером, правильным решением

Разбирать будем на примере финала Индивидуальной олимпиады школьников по информатике и программированию (ИОИП) за 2018-2019г. Переходим по ссылке http://nerc.itmo.ru/school/io/2018-2019.html и скачиваем полный архив олимпиады 24 марта с тестами.

Регистрируемся в Полигоне, создаем контест.


Нажимаем New Problem ; придумываем имя маленькими латинскими буквами. Переходим в список задач, находим нашу и нажимаем start. Ставим нужные ограничения и галочку напротив Are test points enabled? (У нас ведь IOI формат с подзадачами), нажимаем сохранить.
Переходим в statement. Выбираем язык, в name пишем название задачи. У нас в архиве есть файлы с условием, поэтому мы не будем все заполнять, а просто загрузим их. Листаем вниз, нажимаем Add Files. Переходим по нашему пути в папку с задачей, statements/russian/ и загружаем problem.tex и все файлы вида example.01, example.01.a

Spoiler

Повторно нажимаем на Add Files и проверяем условие по ссылке In PDF,
Переходим в чекер. Чекер — программа, которая проверяет правильность ответа. В случае, если ответ однозначен (когда вас просят вывести конкретное число/строку/массив) и чекера в архиве нет можно выбрать стандартный, который проверяет соответствие int/long long/double с определенной точностью и так далее. Как правило чекер всегда есть (а если нет, то бегите подальше с этой олимпиады). Загружаем и сохраняем чекер.

Spoiler

Поехали дальше. Валидатор загружать нам смысла нет. Он проверяет, правильно ли созданы тесты и удовлетворяют ли они всем ограничениям. Мы же можем быть уверены, что все в порядке.
Переходим на вкладку Tests
Нажимаем Add tests, from the files и загружаем тесты.

Spoiler

В случае, если имеются подзадачи (а обычно они имеются), ставим галочку напротив Enable groups.
Смотрим условие задачи. Например, в данной при ограничениях n <= 100 решение набирает не менее 47 балла.
Чтобы поставить сразу нескольким тестам группы, выделяем их и нажимаем на group в появившемся нижнем справа окне.

Spoiler

Если баллы начисляются за каждый пройденный тест, можем проделать точно так же и изменить у всех нужных тестов Point.
Иначе, если баллы начисляются за подгруппу, поставим это количество баллов напротив любого теста, например, последний. Баллы начисляются в случае прохождения всех тестов подгруппы, а значит, если мы пройдем все тесты, то пройдем и выбранный, и получим баллы за подзадачу.
Листаем вниз. В Points policy ставим COMPLETE_GROUP — баллы начисляются за полное прохождение.
Если для прохождения подзадачи нужно чтобы оно прошло предыдущие, ставим нужные группы в Dependencies.


Spoiler

Переходим в Solution files. Сюда обязательно надо загрузить решение. В папке с архивом, в solutions можно найти все возможные решения: правильные и неправильные, получающие AC, TL, ML, WA. Они нужны чтобы составители задач были уверены, что неправильные решения (не)проходят те подгруппы, которые должны.
На вкладке Invocations можно проверить решения.

Spoiler

Теперь нажимаем Commit Changes справа. Подтверждаем. Переходим в Package. Все почти готово, Осталось создать архив.
Нажимаем standard(или full), галочку Verify убирать нежелательно (она запускает все решения на тестах и проверяет, действительно ли неправильные решения неправильные и наоборот), Ждем несколько минут. Все. Задача готова, проделываем тоже самое со всеми остальными.
Теперь создаем контест.
Переходим на главную страницу, New contest, заполняем нужную информацию. Листаем вниз, справа нажимаем на Manage developers list и пишем хэндл: codeforces. Access:write.
Нажимаем на Add problems? и ставим галочки напротив созданных нами задач. Ставим права WRITE. Готово, Запоминаем contest UID, который начинается с 5043 и идем на Codeforces

Spoiler

Загружаем контест в Codeforces

Переходим в Тренировки — Мэшапы — Создать Мэшап. В задачах вставляем UID контеста. В меню редактирования выбираем формат IOI.
Готово!
Если вы обновите что либо в задаче и пересоберете пакет, в течении пары минут задача обновится в мэшапе. В мэшап можно пригласить других пользователей — добавить их хэндл, и у них появится доступ по ссылке, либо загрузить в группу.
Теперь можно поучаствовать в виртуальном соревновании и испытать свои силы.

Spoiler

На этом все, надеюсь этот пост был вам полезен!

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

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

Автор VladKov, история, 4 года назад, По-русски

Здравствуйте. Сегодня, 5 января, прошел первый тур областной олимпиады Республики Казахстан для 11 класса по информатике. Все уже поучаствовали, условия задач появились на оффициальном сайте (кто не верит — https://daryn.kz/olympiads/view/4/2982, вторая ссылка на ЯД, В скачанном архиве еще один архив информатика, там условия), а значит никто не может их дорешать. Поэтому предлагаю обсудить решение третьей, последней задачи C. Для удобства ниже представлено условие. (Также интересуют подходы к частичным решениям, пусть даже и очевидные, например, дп по маске к первой подзадаче)

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

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

Автор VladKov, история, 4 года назад, По-русски

Привет. Помогите в решении этой задачи. Есть офф, решение, которое я все равно не понимаю,

#include <bits/stdc++.h>
using namespace std;

static const int mod = 1000000000 + 7;

static int pow2(int degree) {
    long long accum = 2;
    long long res = 1;
    for (int i = 0; i < 31; i++) {
        if (degree & (1 << i))
            res = res * accum % mod;
        accum = accum * accum % mod;
    }
    return res % mod;
}

int main() {
    int k;
    scanf("%d", &k);
    int degree = k - (k & (k - 1));
    int res = (pow2(degree) + mod - 1) % mod;
    printf("%d", res);
    
    return 0;
}

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

Всех благодарю

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

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

Автор VladKov, история, 4 года назад, По-русски

Не могу разобраться с Динамикой по профилю. В интернете материала мало, понимаю по теории с informatics(https://informatics.msk.ru/mod/resource/view.php?id=5113) и neerc.ifmo. Задача паркет о замощении доминошками 2*1, 1*2 поля n*m. На e-maxx нашел следующий код. (http://e-maxx.ru/algo/profile_dynamics) По моим расчетам, асимптотика составляет O(n*m*2^(2n)), так как calc в худшем случае будет вызаваться по 2 раза по всей длине n. Так ли это? В комментариях указано O(n*m*2^n). Работает быстро И не могу понять дп по излом. профилю. Я читал теорию, о увеличении профилей в 2n, за счёт появления места излома — от 1 до n, и дополнительного бита в маске. Тем не менее, нигде код не нашел. На codeforces нашел такой код, и что то мне подсказывает, что это и есть дп по излому. (https://codeforces.com/gym/100124/submission/2804558)

Код взят к задачи о доминошках. Не могу понять, почему профилей (1 << n), а не (2 << n), что тогда j,и почему при подсчёте маски следующего столбца мы добавляем результат в этот же столбец? Всем благодарен

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

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