Привет всем, Мы рады пригласить вас принять участие в сегодняшнем раунде.
Задачи были подготовлены poopi, Mohammad_JRS, Gerald и мной. Героя сегодняшнего контеста зовут "PMP". Это основной состав нашей команды по программированию вот уже пять лет. Все легенды в задачах метафоричны, но некоторые из них имеют пересечения с реальной жизнью.
Этот Codeforces раунд последний раунд перед надвигающимся финалом чемпионата мира ACM ICPC. Мы желаем всего самого лучшего участникам этого соревнования.
Я хочу поблагодарить Gerald за его помощь и советы по подготовке задач, Delinur за перевод условий на русский и MikeMirzayanov за его замечательную систему.
Мы немного изменили фразу сказанную Burunduk1: "Чтобы раунд был более интересным для нас, прочитайте пожалуйста условия ВСЕХ задач." :)
Надеюсь вам понравятся задачи, высокого рейтинга!
Это перевод оригинального поста с английского. Английский в комментариях приветствуется.
Только о себе и думаете:)
"PMP"? Why not "PIMP"? Sounds cool
(waiting for lots of minuses)
Hi Rebecca :)
.
Скорее всего да. Хотя нужно было авторам , написать про это и другое;)
Такой же комментарий чуть ниже, но на английском, получил +2=)
Двойные стандарты.
.
Палево :)
.
Да, 500-1000-1500-2000-2500!
Please let us know about the point distribution and difficulty ordering of problems also.
we'll have standard points distribution in both divisions.
Is problems sorted by difficulty?
yes, they are.
How is the main character (PMP) supposed to be pronounced? The closest I got was "pimp".
I thought about same thing but got lots of negative votes. Does it mean people pronounce it another way?
Hah, your comment was hidden, but now I saw you said the same. Nah, I suppose they just didn't like the joke =/
You should pronounce it same as "ACM", "ICPC", "MST", "MSC" and all other abbreviations. Thanks for your point.
You got what you wanted.
hope it's not three consecutive unrated rounds
I wish you not to change opinion after round :)
The third is the charm, right =)
That peter50216 solved all the problems gains me some belief about a rated round :)
I hope it will be very interesting!!!;)
I Like PMP!!!
I Like PvP!!!
Good luck
I hope every one will solve at least 1st problem!!! xD
first from the end or from the beginning?
Break stereotypes — solve the first from the end!
and be bad guy!
at least 1 problem
I've heard that Iranians are especially strong in Maths. Should we expect some maths problems?
Anyway, hope everyone enjoys this round.
I read the notes of Div1.E Heaven Tour.
Алкогонки... кто придумал это название??
Видимо, Вы, так как оригинальное название другое :)
Черт. Только после прочтения Вашего комментария посмотрел и заметил, что название другое:)
Боюсь представить, что бы про тебя сказал Фрейд =)
мне тоже так показалось.
The problems were great, thanks!
Как решалась А div 1
Ну заметим, что еси уж мы цифру перекладываем, то так, как нам нужно.
Посмотрим, сколько можно не перекладывать: это кол-во чисел от начала a, которые содержаться в правильно порядке(возможно с чем-то между) в b
Несколько вопросов:
А) Почему такое решение — неправда? Применим к первой перестановке перестановку, обратную ко второй перестановке, тогда ответом будет n-l, где l — длина наибольшего возрастающего префикса первой перестановки (WA на претесте 6)
B) Она решалась четырехмерной динамикой? d[s][t][k][m] — наименьшее время для проезда из s в t, сделав ровно k пересадок и начиная с машины m (вроде переход можно делать за О(N), N^4 состояний — 60^5 операций, что около 800*10^6, должно уложиться в 2 секунды).
З.Ы. Клевые задачки, я лох >.<
Можно убрать в какой машине едешь. Если прекомпьютишь кратчайшие пути на любой одной машине, то это измерение не нужно. Получается N^4.
В я урезал степень на единицу, чтоб было все же не 800 миллионов операций, а в 60 раз меньше. 800 миллионов у меня без считывания и вывода в запуске корячились полторы секунды.
Можно посчитать длину оптимального пути между двумя вершинами "без пересадок", а потом клеить путь из "кусков без пересадок", не перебирая, на какой машине проезжать конкретно этот кусок, а просто выбирая "лучшее значенее", которое мы посчитали заранее.
60^5 (правда еще с логом каким-то) я выломал.
===Она решалась четырехмерной динамикой? d[s][t][k][m]
Мне кажеться трехмерной. F[s][t][k]
нам не важно с какой машины стартовать. Мы делаем предпосчет MinD[i][j] какой машиной оптимально ехать из i в j.
F[s][t][k] = Min( Min( MinD[s][i] + F[i][t][k-1] ) , — едем с пересадкой в городе i F[s][t][k-1] та же задача но с к-1 пересадкой }
По поводу А — у меня такое же решение зашло, проверь, может где в реализации косяк?
Thank. Very interesting contest.
How to solve problem C?
I don't know yet if this solution is correct. Binary search by q. Lets Check if we can get to t from s using q steps: Starting bfs, from all marked verticies,storing DSU, go to the no more than q step from each. If we get to vertex, where we was, check, if dist[current]+dist[vertex where we was]+1<=q, than join their sets in DSU. Finally, if set[s]==set[t], than we can use current q.
P.P.S. Correct, simple bug..
binary search is not needed.
Awesome and interesting problems, thank you very much!
Может кто-нибудь, пожалуйста, подобрать тест, на котором валится вот это 1677854 ? Ну или сразу объяснить, почему это не работает. Я просто для каждой цифры из первой строки смотрел, сколько нужно ходов, чтобы она попала на свое место и среди таких значений брал максимум.
4 3 2 1 4 1 2 3 4 Вроде как
It was fun : )
Am I the only one who doesn't understand the second problem for the Div 2?
With this input: 4 4 I see 9 rhombus who has coordinates like (x,y) (x+1,y+1) (x-1,y+1) (x,y+2) and 1 rhombus who has coordinate (0,2) (2,4) (4,2) (2,0)
Where am I wrong?
It seems that you are only counting the ones with equal diagonals. Those with unequal diagonals are also possible.
Yes you're right, I was so stupid thinking during the contest that "sides equals <=> diagonals equals"... Thanks!
(x,y) (x+1,y) (x-1,y) (x,y+2) is not a rhombus: 3 vertex on one line.
Sorry, I have edited there are some minutes.
Почему работает такое решение, кто-нибудь может объяснить? `int cnt=0;
Вот, это тоже самое (вроде)
Как ты сдал это решение, не понимая его? :)
Я посмотрел на примеры и увидел закономерность.
Did anybody open club of losers?
Last 15 minutes I've tried to debug my B (div 1), and I can't find a mistake. But 3 minutes after end of the contest I've realised that there was
j < i
instead ofj < 3
...If noone open such club, I will open it. I invite everybody, who was unlucky today.)
It reopens every contest by someone
Let's open! I've created array of 100010 elements instead of 200010 (thx Edvard (**fixed**) for hack =) )
Let me in! Let me in!
That was not me, that was homo_sapiens.
Sorry! >_< Too many red coders in room.
Let me in: I tried to hack really wrong solution A div 2, but failed to find 3 numbers a,b,n: n-a % b != 0, n-b % a != 0, n % (a+b) == 0.
Try using a code ;)
Me too, too! Since I'm naive, I believed k ≤ 1000 is important, and iterated 1000 times instead of 60 in B. Never again will doubt myself on these things. >_<
I made a tiny silly mistake in problem D (div2), but it was accepted the pretest. In stead of f[i][u][v] = min(f[i][u][v], f[i — 1][u][k] + f[1][k][v]), it was f[i][u][v] = min(f[i][u][v], f[i — 1][u][k] + f[i — 1][k][v])... It was too late when I realised the mistake 5 minutes after the contest finished. It was failed the system test.
I made the same mistake.
I tried to hack this code 2 times during contest but it passed somehow! (Div2 A)
http://codeforces.net/contest/189/submission/1673396
It ran for 18sec in my PC to produce output of this case: 4000 2 2 2
Compiled with right keys? It works for 13 seconds on my PC without optimisation, and 1.7 with O2.
Спасибо авторам.
Было очень интересно решать Div1 A. }{отя не знаю пройдет или нет.
В D надо было брать все времена выездов по модулю (G+R) и смотреть по отрезкам, кто на каком первом красном остановится (а после этого оставшееся время в пути можно было узнать заранее)? Количество сабмитов подсказывают что где-то может быть подводный камень. Хотя аккуратно это имплементировать тоже надо.
Да, в общем так и надо было.
Мне тоже эта идея в голову пришла, но я не придумал как быстро решать вторую часть.
Да, действительно, я эту часть неправильно придумал. Оттуда тоже просится найти следующую остановку на красном...
Да получается практически такая же подзадача.
Её можно с конца решать. По очереди добавляя вершины в дерево.
Я тоже так думал и думал что это просто. Но это как то очень просто не делается.
Пусть мы стоим в светофоре с номером i в момент начала зеленого света и мы хотим найти первый светофор после него, который будет красным во время нашего приезда. Для этого будем поддерживать бинарное дерево поиска, в котором ключами будут времена нашего приезда к светофорам с номерами j > i, а значениями будут номера светофоров. Также будем хранить минимальный номер светофора в поддереве.
Тогда чтобы найти первый красный светофор, можно сделать сплит по g и из правого поддерева взять минимум. А чтобы обновить дерево для светофора i — 1 на величину len, мы просплитим дерево по
Unable to parse markup [type=CF_TEX]
, ко всем ключам правой части прибавимUnable to parse markup [type=CF_TEX]
, а ко всем ключам левой прибавим len. Затем склеим поддеревья в обратном порядке. Легко видеть, что от этого структура дерева не нарушится.Отвечать на запросы при помощи этой штуки тоже просто и можно это делать в онлайне.
Сдал в дорешивание что-то похожее правда у меня декартово дерево, но ты видимо его и имел в виду. Хотя эту задачу в оффлайн можно обычным деревом отрезков сдать.
Да, у меня тоже декартово дерево в решении. Просто я не уточнял, потому что подойдет любое BST.
How to solve problem D in div2?
First, precalc time(i,j) = min time for moving from i to j without changing car. Second, use dynamic: time2(i,j,k) = min time for moving from i to j with changing car <= k times. Base: time2(i,j,0) = time(i,j). Step: time2(i,j,k+1) = min(time2(i, j, k), min_l(time2(i,l,k) + time2(l, k, 0)) (not sure, that first argument in external min is necessary). When you go from i to j, you change car last time in city l, and move from i to l with changing car <= k times, and from l to k without changing car.
Thanks!
Можно пожаловаться на читера?
Переписка:
Отправитель Получатель Сообщение supercooluku
Vlad_Yermak0v
This time I couldnt solve any prob as i joined late... I will loose even the pupil rank.
can u plss send me the code of the problem c and a?
and plss tell me the formula for b....
Напоминает анекдоты про албанский вирус.
Самое интересное — я не сдал С, а меня просят кинуть код на нее.
А я тоже такое получил. Он похоже всем подряд рассылал.
How to solve problem C div.2?
I used binary search.
смотри выше
Number of fixed points = max {i| b[:i] is subsequence of a}
for the every element a[i] in first array:
Consider all numbers that are to the left in first array... = set A
Consider all numbers that are to the right in second array...= set B (after a[i])
if(A ^ B != {empty}) this is bad for our element (i.e a[i])
That yields that starting from a[i] to the a[n] all elements must be affected, giving us the answer n-i
На какой я бин поиск написал в С?
Я один такой?
У меня прошло с бинпоиском, хоть я и не до конца понимаю, чего оно не за квадрат одну итерацию бинпоиска делает.
Я думал что у меня Н*лог(Н), так-как думал что дисжоин сет работает за О(1), теперь я действительно понял, что это не так.
Сережа, как видно по тегам авторское решение такое как у тебя. Надо было аккуратно писать. Я писал на Java и после того как заменил стандартную очередь на собственую у меня задача пройшла.
Ну или на плюсах писать
Кстати,
1679392 10.05.2012 22:35:05 LeBron 187C — Скверная Память GNU C++ Превышено ограничение времени на тесте 22 2000 мс 12500 КБ
Убрал один оптимайз — я прекращал bfs не только если очередь опустошалась, но и если нашел хоть какой-то подходящий путь к конечной вершине. И без этого оптимайза ТЛ 22.
Думаю в авторском бин. поиск + простой дфс. Или есть что-то за O(n)?
А как доказать что дфс посетит O(N) вершин?
У меня следующее решение.
Поставим в вершину с автобусами волонтера. Для каждой вершины найдем Di — минимальное расстояние до любого волонтера. Тогда пишем бин. поиск по ответу (пусть это k). При этом посещать вершины с Di > k/2 мы не можем. Тогда простой дфс, но по ребру можно идти только если обе вершины имеют Di <= k/2. Можно даже доказать почему это верно.
Только надо аккуратно с парными k.
Да, действительно. Довольно просто.
У меня волна:
На каждом ребре поставлю по вершине, что-бы путь из любой в любую был парной длины. Дальше закидываю все вершины с людьми в очередь(и еще вершину финиш) и иду, добавляя вершины, пока старт и финиш не вместе. Если говорить про сложность дисжоин сета как О(1) или что-то близкое, то это решение О(Н+М). Видимо руки не с того места растут, что я еще и бин поиск прилепил к этому.
В авторском даже немного сложнее. Бинпоиск + обход в ширину с dsu.
Но видимо есть линейное решение, но конечно не задачу С гробить линейными ограничениями.
Там нужно было одно из двух оставить: либо бин поиск убрать(что я в дорешке сделал), либо проверять на связность компоненты с помощью ДФС.
Видимо у меня точно такое же решение. И я тоже пока не понимаю. Видимо поэтому рейтинги еще не обновили. Наверное авторы пытаются взломать это решение.
Даже если взломают, то уже ничего не изменят. Тесты после контеста не меняются. А то так и решения с хешами можно валить и пропихи рандомизированные разные.
Я тоже думаю что это не очень честно.
Не один. АС 0.86 секунды.
Не один. 390мс.
Нет. У меня, в теории n^2 log^2 n, но AC за 1750мс.
Как можно оценить сложность решений вроде 1677747?
Оно заходит со временем 860 мс; при этом я только интуитивно понимаю, что там не квадрат, а что-то более быстрое.
Идея такова — будем обходить BFS наш граф со стартовой позиции, просчитывая для каждой вершины расстояние от ближайшего гида; если пришли в вершину-гида, то запускаем из нее "новый" ВFS, закидывая в очередь ее соседей с расстоянием 1, дальше, если у кого-то из их соседей расстояние больше 2, то поменять на 2 и тоже закинуть в очередь...
Главная проблема — мне кажется, что перерисовок может быть очень много... Как показать, что это не так?
Мне перестала нравиться эта задача...
У меня вроде такое же решение.
Идея -- бинпоиск по ответу, а в проверке Форд-Беллман с очередью (как предлагает Burunduk1 здесь)
Там же, вроде, как раз про то, что это не работает. Или ты имеешь в виду ту штуку с поддержанием леса переходов?
Я про 5ый абзац. http://wcipeg.com/wiki/Shortest_Path_Faster_Algorithm
Я хотел написать такое решение, но почему-то был на 100% уверен, что оно получит TL и не стал его писать.
Is there something special in Test 11 of problem B-div1? It's too large to understand what's wrong. I noticed that I wasn't the only participant who failed on that test.
I think your Floyd algo is wrong
replace
to
Thank you for your help! For some reason I was sure that there are two possible places for the cycle through intermediate vertex: inside and outside other two cycles.
Thank you. My implementation of Floyd was wrong also, and got the same error. I really shouldn't try to save memory:(
My code was wrong on test 11 because of this line: f[i][u][v] = min(f[i][u][v], f[i — 1][u][k] + f[i — 1][k][v]... I resubmitted the code after replacing it by f[i][u][v] = min(f[i][u][v], f[i — 1][u][k] + f[1][k][v] and got accepted.
this part is ok in his code
Ждём официальный разбор )
Может я покажусь занудой, но мне одному кажется, что пропущены запятые при "пожалуйста"? :)
все вопросы к Burunduk1, его цитата)
Потому и минусуют)
Цитата то Burunduk1, но его цитата звучит так: «Пожалуйста, чтобы раунд для вас был еще интереснее, прочитайте условия ВСЕХ задач.»
Thanks poopi & piloop for your great and hard contest!
It was an honor for me to participate in a contest whose Problems were prepared by Rivals of my brother in ACM of Tehran Regional!
Hope you the best in World final! ;)
Div1-C Weak Memory : I was going in the right direction and thought a BFS with Distance array and pushing a vertex again into the Q when visited with smaller distance will TLE. But it worked fast in practice now. What is the worst case complexity of each such BFS ?
Yeah! I spent some 20 minutes during the contest trying to analyze the time complexity, but didn't get anywhere :(
Any help on how to do it?..
когда рейтинг пересчитают! :(
нееееееееееееееееееееееееееееееет..........
[спойлер]
Спасибо за контест! Получил от него огромное удовольствие. Побольше бы таких.
My code got TLE in DIV-1 B in the 12th case. After contest, I changed my 'long long' variables to 'int' and it passed. I know 64bits datatypes will be slower than the 32bit ones, but is it slow enough to give TLE? specially in a fast judge like CF?
I think it's slow because intended solution is O(n^4), while yours is O(k*n^3).
Your solution runs in about 1000*60*60*60 operations. But "correct" solution should do about 60*60*60*60 operations. So it will be really hard not to get TL even if you use int. But if you use long long you will obviously get TL.
1675898
Solution with m*n^4 (though pretty simple) operations passed system tests.
Thanks for replies. Somehow I didn't realize that computing Ks >n is pointless.
Смешно: в задаче С (div. 1), если правильно понял, летает лобовой bfs, при этом TL-ится честное решение (правда, написанное весьма неоптимально на контесте). То ли я неудачник, то ли задача такая.
pfff... Левит? обычный поиск в ширину:)
А какое там честное? Мне вот witua объяснил довольно простое решение, которое точно (n+m)*log(n), а не как у Левита, черт знает что:) :) Сначала посчитаем BFS расстояния от каждой вершины до ближайшего гида (это можно сделать в одном обходе графа), потом будем бинарить по ответу, а в бинарке проверять достижимость обычным DFS. Вся идея в том, что если мы идем по путях между вершинами длиной не более k, то это аналогично тому, что мы идем по вершинах, которые не дальше чем за k/2 от ближайшего гида (только еще надо поставить гида в конечную вершину).
Ну вот так, да. Можно еще в бинпоиске склеивать в dsu гидов, если расстояние между их вершинами в начальном bfs не превосходит Q. А еще можно без бинпоиска вообще, склеивая гидов по ходу bfs (и ловя момент попадания начальной и конечной вершин в одно множество), так за линию получается.
Контест отличный (по крайней мере, Div2)! Вот только эх, не дотянул до 1700. Ну ничего, посидим пока тут.
Кстати интересно, а какая может быть максимальная длина кратчайшего оптимального пути в задаче C?
Задача Е ништяк. Идея простая, реализация сложная. По С интересно действительно ли можно доказать решение которое как бы за квадрат. Я думал над ним на контесте, но ничего в голову не пришло.
По С я во время контеста думал, что доказал, что мы из каждой вершины релаксацию не более 2 раз будем делать, а вот сейчас понял, что ошибся в доказательстве. Мне кажется, там оценка получается похожая на
Unable to parse markup [type=CF_TEX]
, но доказать я ее вот так сходу не могуПо крайней мере тест, который работает за такое время я вчера придумал, а вот до квадрата дотянуть не получается.
Won't there be any editorial for this round?
It was very good round :)))