contests.snarknews.info: "..._В рамках проекта SnarkNews при поддержке компании "Яндекс" стартовала летняя серия индивидуальных соревнований по программированию SnarkNews Summer Series — 2012. Серия состоит из 5 раундов. При этом каждый раунд проходит по правилам TCM/Time. Участвовать в серии могут те, кто или уже зарегистрирован на сервере личных соревнований SnarkNews (список зарегистрированных доступен по ссылке "Пользователи" в верхнем меню), или подал заявку на участие в SNSS-2012 согласно правилам серии по адресу sn_register(собака)snarknews(точка)info._ Участвовать в SNSS-2012 можно, начиная с любого раунда..."
Кто может помочь?Я отослал письмо с запросом регистрации, но уже нет ответа 3 дня.
Не приходил mail, в спаме тоже нет. Переотправьте плз...
Извините, а у Вас с задачей С все нормально?
Я вошел в систему, но растерялся. Здесь и счетчик в котором 20 мин осталось и написано не начался и везде написано виртуальный контест и длительность 80 мин. А на календаре аропана написано что длительность еще 7 дней. Что происходит? Подскажите!
Такие правила проведение — ты можешь в любой момент начать решать до окончания раунда, но решать будешь только 80 минут.
а что значит вот это:"00:33:36 / НЕ НАЧАЛСЯ" в зеленой полосочке?
Текущее время, я полагаю.
Правила не читай
@
Контест начинай
А куда пропал таймер у людей, которые в данный момент пишут раунд, на страничке Standings?
Было бы неплохо открыть дорешку или какой-нибудь еще контест, чтобы можно было проверить, что твой шаблон нормально компилируется и запускается на сервере. У меня внезапно возникли RE 1 на Java, причем решения с таким же шаблоном нормально заходят в дорешку Opencup. Видимо, из-за политики безопасности какие-то функции нельзя вызывать.
Дорешивание есть в этом же контесте, сразу после окончания.
Ага, поэтому надо именно после контеста, сразу после окончания, проверять, что все работает.
А для чего там находится задача X? разве не для того,чтобы посылать туда ерунду и смотреть, как она работает?
но обратно же, до начала соревнования не потестишь...
Я выяснил, что происходит. На Java 6 нельзя создавать новый Thread — падает с Runtime Error. На Java 7 все работает.
Кому интересно, вот код, который работает на Java 7 и вызывает Runtime Error на Java 6.
Надеюсь, что фраза "в одной задаче слабые тесты" подпадает под пункт правил "обсуждение неточностей или ошибок" не ведёт к дисквалификации". Если нет — поправьте.
Ты о чем?
О том, что по одной задаче заходит аж 2 неверных алгоритма, которые на нормальных тестах дают TL с приличным запасом. Не будем это обсуждать до конца раунда. Тесты я уже отправил судьям. Может это только я такой глупый :-)
UPD: Хм... Раунд закончился, а ответа от судей или падения хотя бы своих решений я так и не увидел...
Раунд еще не закончился
Есть правило, что на АСМ контестах ОК не пересуживается
Добавление тестов после того, как хотя бы один участник сдал задачу, противоречит правилам. Вне зависимости от того, будет пересужен соответствующий OK или нет (участники оказываются в неравных условиях).
В задаче D действительно тесты были рандомными, и некоторые специально подобранные ручные тесты отсутствовали. Возможно, "в дорешивание" предложенные тесты и будут добавлены.
Думаю это все же лучше во время соревнования донести до судей, а уже после окончания — общественности...
Раунд закончился. Как решать B ?
Я построил Карася на 1 строке. переходы из конечного состояния в него же.
Суем в корень 1, далее N раз из каждоый вершины переносим и 0, и 1.
Карась легко строится при помощи КМП функции...
Динамика fijt — количество слов длины i, максимальная длина префикса, который равен суффиксу ключа у этих слов равна j, и t false|true — содержат ли слова ключ как подстроку.
Рекомендуемое знание алгоритмов КМП, Ахо-Карасик.
Ещё одна динамика: fn — количество слов длины n, в которых ключ встречается только в конце, но не раньше. Если длина ключа m, то тогда fn равняется 2n - m (общее количество строк длины n, которые оканчиваются на ключ) минус количество строк длины n, которые содержат ключ так же и раньше. А это:
Ну а потом ответ считается как сумма всех di·2l - i, т.к. справа всё равно, какие биты стоят (l это нужная в задаче длина).
красивое решение, а то с этими состояниями было не было как-то не приятно... спасибо
Только что отрешал. Кто-нибудь может подсказать что требовалось в D ? Я выводил ((n^k)-1)mod m, WA5
(n^k-1)/(n-1) = 1 + n + n^2 + n^(k-1)
Заметим, что
1 + n^(2k-1) = (n^k+1)(1 + ... + n ^(k-1))
Рекурсивно считаем как возведение в степень. Итого log^2
Ну или матричку ((1,n),(0,n)) можно возвести
О, действительно, спасибо:)
Не совсем понятно, что и как рекурсивно считаем? Нам же надо посчитать (Nk - 1) / (N - 1) mod M. Я так понимаю, что можно посчитать Nk-1 mod M*(N-1) и поделить на N-1, но вычисления не помещаются в long long =(
1 + n + n2 + ... + nk - 1
Если k четное, то эта штука равна (1 + n + ... + nk / 2 - 1)(1 + nk / 2)
Если k нечетное, то посчитаем 1 + n + n2 + ... + nk - 2 и прибавим nk - 1
Ух ты, оно таки считается быстро. Понял, спасибо.
Второе проще ans(n,k) = 1 + n * ans(n, k-1)
Имелся в виду другой подход. Воспользуемся представлением
а рекурсия тут при том, что сумму в правой части можно разбить на левую половину и правую половину, и они будут отличаться на множитель (и на дополнительное слагаемое, если количество слагаемых нечётно).
Можно и за log, если из 1 + ... + n2k - 1 выносить 1 + n.
Еще можно узнать все степени, которые нам понадобятся, за логарифм сумарно их все посчитать, а потом использовать. Выйдет решение за логарифм.
Или можно воспользоваться тем, что если a делится на b, то (a / b) % m = (a % (b * m)) / b, где в правой части деление не по модулю, а обычное, причем остатка не будет.
Ты забыл поделить на N - 1, у меня такая же ошибка. Прочитай внимательно условие ;)
Судя по монитору нас таких много ) в общем больше не буду сдавать в слепую, толку мне от этого маловато.
Да, не мало, и тесты хорошо подобраны)... Толку не много, но просто надо вбить в себя правило "внимательно читать и писать"
Присоединяюсь к клубу.
И ведь искал в условии, сколько сотрудников. Но мысль, что в первых двух предложениях текста может быть часть условия, меня почему-то не посетила. В итоге остановился на понимании «в книге учёта будет одна запись на всех сотрудников». Что, конечно, противоречит условию («... для каждого из сотрудников компании»).
Блин, я в задаче D забыл, что ограничения до 109, и отправил for от 0 до k-1... Epic Fail.
Ссылка на задачи 1-го тура открывает задачи другого контеста
Не так ссылка, вот
А что с той ?
я не знать
fixed (почему-то скопировались задачи с SNWS12R1).
Как решается F? Динамика за O(сумма всех A[i]) для каждого теста дает тайм
Пройти направо, обеспечивая h[i + 1] ≤ h[i] + 1; пройти налево, обеспечивая h[i - 1] ≤ h[i] + 1. Каждый раз уменьшаем высоту на как можно меньшее число. Легко доказать, что в результате двух проходов получится нужный результат, а в процессе мы не убирали лишних коробок.
Можно поподробнее, почему это верно?
Заметим, что мы никогда не убираем лишнего: если мы снимаем коробки сверху с i башни, значит, h[i] = h[i ± 1] + 1. Высота соседа со временем не увеличится, а значит, текущее значение h[i] также не меньше максимально возможного ответа. По индукции, мы никогда не теряем оптимальности.
После первого прохода нам известно, что h[i - 1] ≥ h[i] - 1. Во время второго прохода h[i] может только уменьшиться, неравенство сохранится до момента обработки h[i - 1]. Далее возможны два случая:
1) h[i] - 1 ≤ h[i - 1] ≤ h[i] + 1. Высоту h[i - 1] менять не будем.
2) h[i - 1] > h[i] + 1. Тогда новая h[i - 1] = h[i] + 1 > h[i] - 1.
Значит, неравенство h[i - 1] ≥ h[i] - 1 сохранится. В свою очередь, во время второго прохода установится и h[i - 1] ≤ h[i] + 1. Получили то, что нужно.
Сдал динамику по позиции и высоте последнего зафиксированного ящика, зашло без проблем. Сложность, похоже, такая как у тебя.
Я в приоритетную очередь кидал столбики из ящиков и каждый раз вытаскивал самый маленький и забирал лишнее ящики у соседей
Ох ты ж блин, с set-ом TL, с priority_queue OK! Авторам незачет, NlogN тут явно надо было отсекать.
То же самое и с A.
Кстати, на Java руками-написанная-куча заходит. PriorityQueue, конечно же, TL-ит.
А еще там недотест, потому что вот это решение тоже получило AC. В нем, в отличие от решения по предыдущей ссылке, есть существенная бага.
Странно, у меня на Java PriorityQueue с использованием объектов заходит.
Кстати, это решение легко переделывается в линейное используя вместо приоритетной очереди n списков и сразу отсекая кучи у которых больше n ящиков
У меня немного укуренное решение. Посортим массив подсчетом, будем хранить в ids[x] номера элементов, значение которых равно x. Теперь бежим по этим элементам, начиная с меньших значений. Когда мы рассматриваем элемент с номером i, равный x, надо элементы с номерами i-1 и i+1, если они были больше, уменьшить до величины x+1 и засунуть в ids[x+1]. Получается, что элементы могут находиться в нескольких ids-ах, поэтому надо проверять их корректность условием вида if (a[i] == x), это чем-то похоже на пропуск некорректных элементов в Дейкстре с priority_queue.
Это решение, однако, явно использует, что a[i] <= 100, если бы этого ограничения не было, то же самое приходилось бы делать set<pair<int,int>>-ом за NlogN, что у меня поначалу не зашло. Так что оно нехорошее:)
P.S. priority_queue таки заходит, см. коммент выше. Пичалька.
Я делал так: идём слева направо, уменьшая по надобности высоты блоков. Если пришлось уменьшить высоту из-за того, что блок справа слишком низкий, то возвращаемся к предыдущему блоку и продолжаем процесс. Опирался на тот факт, что высота каждого столбика не больше 100, на каждом шаге назад мы уменьшали высоту какого-то блока, а 10^7 — это не очень много =) Да и вообще, мы не сможем сделать более 100 шагов назад подряд, так что прошло без проблем.
Краткий разбор Е:
Как известно, кратчайшие пути из конкретной вершины в графе без отрицательных циклов образуют ориентированный ациклический граф. Нам нужно найти наиболее удаленную от офиса вершину, такую, чтобы из нее были достижимы дома обоих программистов. Решение: Дейкстра (построение графа кратчайших путей из офиса) + ДФС из домов обоих программистов по обратным ребрам графа, построенного на предыдущем шаге (определение достижимости).
Можно просто запустить три дейкстры: из офиса и из каждого дома. Потом переберем все вершины v. Эта вершина может быть в пути, если растояние от офиса до v + v до i-того дома = расстоянию от офиса до i-того дома. Ответом будет минимум расстояний от офиса до вершины v по всем вершинам, которе могут быть на пути.
А задача C должна решаться обычным перебором или там что-то хитрее должно быть?
Перебор проходит проходит... очень много отсекается если сразу проверять пересечение отрезков...