Доброго времени суток, друзья)
Через несколько часов состоится очередной раунд Codeforces #166 для участников Div. 2. Как всегда, остальные могут поучаствовать в соревновании вне конкурса.
И вновь для вас старалась группа авторов: Павел Холкин (HolkinPV), Николай Кузнецов (NALP), Артем Рахов (RAD) и Геральд Агапов (Gerald). Традиционно хочется поблагодарить Михаила Мирзаянова (MikeMirzayanov) за системы Codeforces и Polygon, а также Марию Белову (Delinur) за перевод условий задач.
UPD: Распределение баллов будет немножко нестандартным — 500, 1000, 1500, 2000, 3000.
Надеемся, что соревнование окажется удачным для всех участников. Желаем высокого рейтинга, успешных взломов и хорошего настроения)
UPD2: соревнование завершилось, надеемся оно вам понравилось)
Поздравляем победителей:
1) xrvpud221
2) xyz111
3) nanoha
4) wyx528
5) GuyUpLion
UPD3: разбор задач уже опубликован, его можно найти здесь
This group always offers good problems...!!!
Сегодня по старинке, первые 300 мест получают те, кто быстро и безбажно закодят первые 2 задачи?
прошлый раз первые 2 задачи мне хватило, чтобы получить 88-ое место и выйти в div1
Легкие задачи не нравятся... Тяжелые тоже не нравятся... Что ж мы за люди такие =)
Я в тот контест тоже получил 88-ое место и вышел в div-1 :D Надеюсь в этот раз такого не будет
Ты не хочешь в div-1? :)
Хочу конечно, но еще не чувствую себя достаточно сильным для него :)
Сегодняшний контест был намного лучше.
Так долго ждали... И дождались! =)
Распределение баллов определим чуть позже)
В последнее время стало популярным хранить эту тайну до начала контеста)
В последнее время стало попоулярным решать это незадолго до контеста, скорее
Не вижу ничего плохого в этой практике. В любом случае влияние на окончательные результаты минимальное
MikeMirzayanov's contribution is +210 O_O
Keep getting negative votes and your contribution will reach his (by absolute value) sooner than you can possibly imagine.
No one will win JKeeJ1e30
Учавствовал в контесте HolkinPV => стал специалистом. Учавствовал в контесте HolkinPV второй раз => стал экспертом. Участвую в контесте HolkinPV третий раз => ???
...Стал опять специалистом)
Ждём четвертый контест..
Нестандартное распределение баллов: 500, 1000, 1500, 2000, 3000
К чему бы это?
Всем удачи! (особенно новичкам)!
Такие все шутники) но иногда приятно) ставлю плюс)
Пятую не трогать.
Надеюсь взять реванш за прошлый контест(больно уж плохо я сдал в тот раз).
I am sexy and i am no it.
Do you know that in your comment word "know" must be written instead of word "no"
Daite mne pou4astvovati
na 1 min opozdal :(
its time
Мда, одну задачу сделал... Лучше, чем ничего, и все равно, что другие не могу :)
Напишу еще один пост, чтоб можно было и его минусовать. Но, собственно, за что минус? За то, что я одну задачу решил?
Молчи пока -60 не получил:))
Минусы — это эквивалент полезности донесенной тобой информации до людей. Зачем мне знать сколько задач ты решил?
Да ладно! "Такие все шутники) но иногда приятно) ставлю плюс)" — 10 плюсов, но какая людям разница, что он тоже постаил +?
А почему вы так печетесь о своем вкладе. Как-будто от этого у вас что-то длиннее станет
Hi authors, Problem C div2 says that any alternative solution is accepted. So this answer for test: 11 3 11122233123 shouldn't be accepted?
It should, but you should have printed the blank spaces between each number...
if we divided in three group it will be:
all 3 of the sequence is not an arithmetic progression
Сложный контест для Div.2 :(
Ну первые три задачи решались достаточно легко, а остальные уже веселее.
Как Е решается?
Нужно посмотреть на разности между числами. Понять, что если изначально была разность k, то через несколько преобразований мы сможем получить такие и только такие числа: пусть k1 — это k поделенное на максимальную степень двойки, на которую делится k. тогда мы можем получить любую разность вида k1 * x (x > 0).
Доделывается так: k1 делит (ai — 1) для любого i. То есть, k1 — нечетный делитель НОД(ai — 1). Перебираем k1 за корень. А дальше понимаем, что k = k1 * 2^l. Перебираем l, увеличиваем ответ на m — k.
Как из x получить 2 * x я понял, но как получить остальные?
Как С решается?
Если [n/k]<=2, то выводим -1. (Вроде очевидно — ведь хотя бы в одно множество попадает два числа — они и будут образовывать прогрессию).
Пусть n mod k = 0. Тогда в каждое множество можно записать n/k чисел. Первые n-k чисел заполним числами 1,2,3,...,k (по n/k — 1 каждого). Остальные (с n-k+1 по n-ный) последовательностью 1,2,3,...,n. Получим что-то вроде 1,1,...,1,2,2,...,2,...,k,k,...,k,1,2,...,k.
Очевидно, что если бы хотя бы одна из последовательностей образовывала бы прогрессию, то ее разность была бы равна 1 (Поскольку n/k>=3, то n/k — 1 >=2. Значит, в последовательности-ответе для каждого i=1,k всегда есть хотя бы два подряд идущих числа i). Но очевидно, что число i стоит и на i*(n/k — 1)й позиции, и на (n+1-i)й, из-за его разность не может равняться 1. Таким образом, эта последовательность является ответом.
Если же n mod k!=0, то оставшиеся ячейки можно заполнить любыми числами.
С-шку решали кто во что горазд (кто как придумает перемешать). Я выводил так: 1..k, k..1, 2, 1, 4, 3, 6, 5...k, остальное заполнял единицами)
Если n / k < 3, то -1. Иначе, выводим k, 1, 2, 3, ..., k — 1. Потом выводим 1, 2, ..., k, 1, 2, ..., k пока длина не будет равна N. Мое решение тут.
Это чувство... Когда ты получил по D меньше, чем по B
for all who had WA #8 in problem D,I think the test case is
abaab 01 2
and what do you say abt TLE + memory limit exceeded for D.
Почему в C(div 2) на 1 тесте не проходит 12332112332 всё понял
Вторая группа образует арифметическую прогрессию.
У тебя 2-ой в арифметической прогрессии. Через три
Двойки образуют арифметическую прогрессию
Между всеми двойками стоит по две цифры.
Числа 2 5 8 11 — арифметическая прогрессия с разностью 3
Как писать Д-шку без хэшей?
Можно было написать бор
Я конечно туплю, но что потом?
Находим подходящие подстроки, в бор добавляем все их суффиксы. Ответ — количество вершин в боре, которые являются концом какой-либо строки.
Вот так http://pastebin.com/pTUbVW56
Переберем внешним циклом длину подстрок переменной len. внутри цикла заводим сет строк. далее перебираем все подстроки данной длины и складываем их в сет. после размер полученного сета плюсуем к итоговому ответу. со скрипом, но заходит..
А умеет ли кто-нибудь ломать такое решение, кстати?
мое не сломали http://codeforces.me/contest/271/submission/3100642
Можно префикс-функцией. Берем окончание начальной строки сначала длины 1, потом 2, ..., считаем каждый раз префикс-функцию, пробегаем по массиву-результату и смотрим наибольшее число — пусть m. Тогда все подстроки текущего окончания длины больше m будут новыми, осталось проверить их на хорошесть.
UPD. код
Кто-нибудь взламывал B на тесте 500 500 97430 .... Вроде должен быть ТЛ, если от элемента матрицы искать в лоб ближайшее простое. У меня не получилось загрузить тест(
Был подобный тест, загружал генератор
Думаю у многих посыпется
А что должно произойти? У меня решение "В лоб", что называется, сейчас протестировал -- меньше секунды.
O(500 * 500 * 1200) как бы
Я рассчитал один раз массив с простыми числами. Дальше -- просто считаем "расстояние" от этого числа до ближайшего простого. Где тут 1200? Вот моё решение (ну там только не из файла считывал, а так): http://pastebin.com/Lu3jHYJb
В лоб, это когда если число не простое, каждый раз за корень делать проверку следующего числа.
В лоб — просчитать простые решетом, а затем от текущего идти до следующего. Можно бинпоиск было запихнуть
Если взять число 97430, то следующее простое только через 1200 шагов. Всего чисел 500^2. Значит выше 250 миллионов операций. Почему прошло — без понятия
Да, объяснили уже. У меня не совсем в лоб. Я простые заранее посчитал.
300 млн500 * 500 * (на макстесте порядка 100, а не 1200) операций вида "прибавь один, посмотри в массив" работают очень быстро — у меня на джаве чуть больше 200 мс.проверка за корень числа близкого к 100.000 — это 330 операций. следующее простое 97441,то есть 11 шагов и это 3500 операций. 25000 * 3500 < 100 лямов, откуда 250?
Понравилась задача С. Вроде не сложная, но думать пришлось =))
да жалко что не успел сабмит сделать) считал своим долгом выводить 123321123321, не догнал что можно сразу сделать так 321123123, зато вот номерок счастливый отхватил
кстати скажите кто-нибудь как можно быстро сделать это вот самое 123321123321 а то тормозил тормозил
UPD оказалось проще всего 234112341234
Не проще
112233123111
?двойка образует прогрессию
А за что минусы, там же правда для 2-ки прогрессия.
Оба варианта неправильные, ведь числа 2го будут образовывать последоваотельность с разницей 2.
Можно сделать так
если n < 3 * k ответ -1
иначе выводим 1 2 ... k 2 3 .... k 1 1 2 ..... k
в первом случае разница будет 2k, k — 1, k — 1 , ... k — 1
во втором — 1, k + 1 , ... k + 1 оставшиеся числа пихаем рандомно, к примеру, все 1
хмм, да действительно опять я налажал. Надо будет обязательно сдать. У человека в комнате была офигенная реализация 3096917
Блиииин, уверен на 90%, что Time limit на задаче D был бы взят, если б это был не Ruby...
Так минусуете, будто у вас есть аргументы против, лол.
Какой смысл писать задачу, где важна производительность, на заведомо более медленном языке?
Какой смысл тогда в наличии интерпретаторов медленных языков на codeforces?
Чтобы писать то, где не нужна производительность?
Только если С для того, чтобы можно было пройти с плохим алгоритмом.
А никто вам не гарантирует, что решение должно существовать на всех возможных языках. Голова должна быть, чтобы решать, какой язык выбрать. Тем более, если знаете об особенностях конкретного языка.
Ну вот, B свалилась ..( Обычно в Div.2 вторая задача не требует таких оптимизаций... а сейчас она валится даже у тех, у кого D прошла.
И этот заминусуйте просто так, plz. Я люблю вами командовать.
Может уже хватит плакаться? Если не нравятся контесты, либо ищите другую платформу, либо выдвигайте конкретные идеи по улучшению/создавайте свой контест.
Может уже хватит юродствовать? Идея существует давно. На mipt-e. Множители на каждый язык http://acm.mipt.ru/judge/info.pl?show=faq
Это тоже не решает проблему. Даже различные решения одной и той же задачи на разных языках программирования могут различаться по времени работы как в полтора, так и в десять раз.
Удалено по причине большого количества минусов.
Какой именно предпосчет в B вы собрались делать?
Преподсчёт простых чисел, ровно это же делают, кстати, в разборе. Моё топорное решение завалило 14 тест.
Уточню: для каждого числа предподсчёт следующего простого числа.
Есть очень много решений, не использующих предпосчет, получивших полный балл :) Например, lower_bound'ом по массиву простых чисел.
Был ли в D antiheshtest?
У меня прошёл хэш
Мое решение получало ВА 8 (наверное анти-хэш), пока я не поставил двойное хэширование -> AC.
Я проходил ва 8 тупо за счет увеличения модуля
У меня хэши получили WA41
Многие хэши валились с WA 41.
Потому что там
abbabaabbaababbab...
:)Что интересно, аккуратное решение в лоб через сэт и копии подстрок без всяких хэшей проходит, хотя теоретически асимптотика у него не очень: О(n^3), если вообще не О(n^3*ln(n)).
3103424
У меня не прошло — даже на претестах ТЛ 8.
Upd. Дали бы сразу ссылку на код, теперь мой коммент лишний
у вас МЛ, а чтоб его избежать, нужно во внешнем цикле перебирать длину подстроки, и на каждой его итерации очищать мэп, иначе ж у вас О(n^3) памяти кушается.
Ссылку дал сразу: как можете видеть, то сообщение не редактировано=)
во во, у меня такое же решение прошло... странно..
а почему если я использую бор для проверки на копию, у меня тл? вроде должен быстрее работать чем сет? нет?
Если я правильно понимаю, то это — 3101706 тот код и тут O(n^3) сложность.
асимптотически да, но это же тоже самое, что и с сетом, только без логарифма? Разве сравнение строк не за О(legnth)?
А вот хороший вопрос, какова асимптотика работы в худшем случае. Если различных подстрок получилось слишком много, то они и различаются в первых нескольких символах. А если у многих пар подстрок различие далеко от начала, то и самих различных подстрок мало.
С бором можно не каждую новую подстроку добавлять заново, а, добавляя к подстроке один символ, переходить в боре по одному ребру. Тогда будет O(N2) времени и O(N2 * |Σ|) памяти.
The problems were excellent! The problem-setters deserve a round of applause.
Nice problem set, the writers managed to come up with balanced problems, got 4 out 5.
waiting for rating update .....
In problem D, I use 2 hash value with int always get wrong answer on test 41, and my answer always is 241238 (the right is 398680), and I use long long with same hash numbers get accepted. Why there is so big difference between them ? Many helps !
I just exchanjed power of prime number from 31 to 29 and 37, then got accept.
You guys use hash without handling conflict, and still got ACCEPTED! How unfair... I found a nice c++ solution(3100030) in my room that use
set<string>
, and the worst time complexity is O(n^3 log(n)), still very nice, though.My first attempt was a Python solution using a Trie, which is O(n^2). It got TLE, saddly. Then I was forced to translate the Python script into C++.
I used suffix array with time complexity O(nlog^2n) in building the array and O(nlogn) for the rest.3108063 This is totally unfair that even solution with time complexity O(n^3logn) can be accepted. The test case should be bigger, say string of length 1000,000.
When the data scale is too large, we will lost some interesting solutions. It's also unfair for some dynamic languages since a loop with 1000000 times may cost about 1 sec. So I think 10^3 or 10^5 is fine.
After participating in some contests here, now, I confess that I'm not clever enough as I thought I am :( I'm not sure if continue to participate will make it better; I even can not get to 1700 :(
Any friend has an idea about why I'm not successful here as much as my successful in business software development (I am Microsoft Visual C# MVP 2011)?!
I just like to know if I should continue or break to study more and then come back.
Thanks in advance!
Remember… practice makes perfect.
It is a wonderful place to get knowledge and I don't have a great result but I am trying to be better day by day here.
Хм... Почему этот контест не отображается в списке моих соревнований. И не повлиял на рейтинг... Никто не знает, почему?
Anyone willing to share an idea for E problem?
Sorry accidently posted 'in russian'
Anyone willing to share an idea for problem E?
My idea was based on this observation:
Suppose that y=x+k
What we really care for is the difference between a pair of numbers (the k).
(because we can get (a+1,b+1) and (a-1,b-1) from (a,b) )
The first horse does not change the difference
The second horse divides the difference (k) by two
The third horse gets two pairs with differences = k1,k2 and gives a pair with difference=k1+k2
(The rest is simple NT -divisibility, gcd,etc.- )
I thought with the same idea in the contest but actually first horse give (a+1,b+1) form (a,b) but don't give (a-1,b-1)
(a, b) -> (b, 2 * b — a) -> (a, 2 * b — a) -> (2 * a — 2, 2 * b — 2) -> (a — 1, b — 1)
Thanks to the creators , for making the catching stuff in the questions BOLD, it really helped!!
Задачу C я делал так:
112233441234
Unfortunately I missed the contest.. Was celebrating my birthday
yaar aaj tu Div 1 me pahuch jata :( btw hbd :)
HBD :)
its showing me new color but old rating :( :( yyyyyy so ?
its showing me blue color but with old rating :( :( yyyyyyyyyy so ?
It's showing me blue but with older rating 1448 :( why ???
Подскажите, пожалуйста, почему это решение для B http://pastebin.com/pLx8hKxx валится уже на первом тесте (3102799) из условия (хотя у меня на машине всё ок):
Ввод 3 3 1 2 3 5 6 1 4 4 1
Вывод 0
Ответ 1
Комментарий чекера wrong answer 1st numbers differ — expected: '1', found: '0'
Проблема в строке
Суффик
ul
означаетunsigned long
, а неunsigned long long
и при сдвиге на 40 битов 32-хбитного числа происходит undefined behavior.Правильно будет
или
Скорее уж тогда
1ULL
.Could someone explain Div2.E problem body? As I understand:
But it surely isn't correct understanding.
Actually, it is the correct understanding.
Anyone willing to share an idea for problem D without hash? Thanks a lot.
prefixs + substrings + set = 3103424
thankyou
please explain how could this pass?
you have 2 "for" and inside them you have "substr" which has complexity O(j-i) so your total complexity is O(N^3)
You are right, but it has a low constant, so 2 "for" and "substr" inside them take only 350 ms on a string with length=1500.
Also working with set we have total complexity O(N^3*ln(n)), because comparing the string takes O(N). But it is also with low constant and is unattainable, because not all substrings are comparable in full length.
Four of the winners took part in Codeforces contest for the first time,the rest one only took part twice....
I'm sure they are multiple accounts
I'm sure they aren't muliple accounts
Absolutely agree,in most contests there are about 2-3 unrated winners,maybe I'm mistaken but I think they are multiple accounts
One question: the limit for the Div2 B were n,m <= 500, but what is the point to have such limits, when the max size of test file for hacking is just 256 KB? I mean there were a lot of solutions that could be hacked using a matrix of size 500 x 500, but it wasn't possible because the system won't accept files that big. Many solutions were done in O(n*m*nextPrime(x)) and I think this wasn't the complexity intended to solve this problem. An acceptable one would be done in O(n*m*log(closestprime(x)).
you have to write code to generate test-cases you want ,not the test-case itself
nextPrime(x) factor is extremely small ~ O(log x), so it's just looking for 20 consecutive bytes of memory. Bad binary search could be slower.
Ждем не дождемся Codeforces Round #167
I was using n^2(log(n)) approach for this question but don't know why 283113903 this submission was giving tle in test case 21 can somone help