387A - Георгий и сон
Я опишу достаточно простое решение. Пусть Георгий проснулся в h0 часов и m0 минут, а спал ровно h1 часов и m1 минут. Получим числа hp = h0 - h1 и mp = m0 - m1. Если mp < 0, то прибавим к нему 60 минут, а из hp вычтем единицу. Потом, если окажется что hp < 0, то прибавим к нему 24 часа. Вывести ответ на C++ очень просто следующей строкой:
Сложность решения: O(1) по времени / O(1) по памяти.
printf("%02d:%02d", h[p], m[p]).
Авторское решение: 5850831
387B - Георгий и раунд
Переберем количество требований на сложности, которые мы удовлетворим, остальные задачи мы придумаем и подготовим. Понятно, что если мы решили удовлетворить i требований, то выгодно взять те, что обладают минимальной сложностью. Упростим i самых сложных задач до самых легких требований. Если все прошло успешно, то обновим ответ величиной n - i.
Сложность решения: O(n2) по времени / O(n) по памяти. Отмечу, существует решение и за линейную сложность O(n + m).
Авторское решение: 5850888
387C - Георгий и число
Получим следующее неприводимое представление числа p = a1 + a2 + ... + ak, где + — конкатенация, а числа ai имеют вид x00..000 (некоторая ненулевая цифра, потом нули). Найдем самой большой индекс i, такой, что число a1 + a2 + ... + ai - 1 < ai. Если такого i нет, то i = 1. Тогда ответом на задачу будет число k - i + 1. Сравнения чисел можно производить, используя длину чисел и первые цифры. Попробуйте доказать это, используя единственность неприводимого разложения.
Сложность решения: O(n) по времени / O(n) по памяти.
Авторское решение: 5850919
387D - Георгий и интересный граф
Для решения данной задачи нужно знать что такое максимальное паросочетание.
Переберем центр графа i. Удалим все дуги вида (i, u) и (u, i). Пусть таких дуг cntWithI. Количество остальных дуг обозначим за Other. На остальных дугах и всех вершинах, кроме i, запустим алгоритм поиска максимального паросочетания, если полагать в качестве левой доли степень исхода, а в качестве правой степень захода. Дуга из нашего графа (i, j) будет равна дуге (i, j) — где i в левой доле, а j — в правой. Пусть его размер равен leng. Тогда ответ равен для текущей вершины равен 2n - 1 - cntWithI + Other - leng + (n - 1) - leng. Обновим глобальный ответ. Почему так можно делать? Понятно, что если мы найдем максимальное паросочетание в графе, мы удовлетворим максимально возможное количество требований на степени исхода и захода. Поэтому ребра из максимального паросочетания мы удалять не будем, удалим все кроме максимального паросочетания, и дополним его до полного паросочетания добавив (n - 1) - leng ребер. Следует добавить, что важно требование, что петли разрешены. Без этого разрешения так решать задачу нельзя.
Сложность решения: O(n2m) по времени / O(n + m) по памяти.
387E - Георгий и карточки
Посчитаем массивы pos[i] — позиция числа i перестановке p, и need[i] — нужно ли удалить число i из перестановки p.
Теперь рассмотрим числа a1, a2, ..., an - k — числа, которые нужно удалить. Понятно, что их выгодно удалять в порядке возрастания, это нетрудно доказать.
Теперь будем иди по всем числам от 1 до n. Дополнительно будем поддерживать упорядоченное множество (set <> в с++, TreeSet в Java) — позиции не удаленных чисел, строго меньших текущего. Эти числа, как раз, могут создать <<препятствия>> для позиции текущего числа. Данное множество очень просто поддерживать. Для удобства, можно добавить в данное множество числа - 1 и n. Теперь очень просто узнать размер максимального подотрезка, на котором число будет минимум. Это делается с помощью стандартных функций языка программирования (lower и higher в Java) Теперь осталось воспользоваться деревом Фенвика, чтобы узнать количество еще не удаленных чисел на данном отрезке.
Сложность решения:
по времени / O(n) по памяти.
Очень короткая реализация решения на языке Java: 5850986









Can anyone explain the solution of problem C
Well my approach to this question was different , just start from the beginning and take 2 string variables. Let the variables be g and l (for global and local resp.),now g will store the substring starting from the beginning till just before the index from where l started.Now if the next character is '0' then we are bound to include it in the local string otherwise just see that whether g>=l or not , if yes then increase ans by 1 and include l in g (g+=l) and clear l, else make ans=1, g=g+l and clear l. This is because if g<l then obviously the substring in l should occur before g in resultant substring (meaning it will be "lg" instead of "gl"). Finally print the ans........
Hope it helps....
Hello, (sorry for my poor english) My solution traverses the string with 2 pointers and whenever it encounters a string representing a smaller number than what's left then add 1 to the answer. It is not necessary to generate any substrings... Just analyze the representation of strings of equal length. Here's my solution: solutionECMC
I am not generating any substring as such , it was the concept used in my solution, my time complexity is O(n).
Sorry for necroposting, great solution to begin with; but I wanted to confirm the logic behind time complexity being O(n). As for each comparison of strings with equal length it takes O(n), and the number of such comparisons being log(n), we would get a geometric sum, leading to O(n), is that right?
У кого — нибудь зашло в Е такое? : для каждого из чисел не входяших во второй массив, бинпоиском будем искать левую и правую границу(отдельно) проверкой минимума с помощью дерева отрезков ? Просто ТЛ8, или я криво пишу, интересно
У дерева отрезков сверху есть довольно внушительная константа, 10 ^ 6 * log^2(10^6) * C(от дерева отрезков) это уже довольно много ~10 ^ 9 операций, что обычно не заходит в 2 секунды.
Можно без бинпоиска — за один подъем и спуск по дереву отрезков можно найти ближайший элемент меньший заданного. 5852493 (см. функцию
left/right(int i)))Не много не пойму как работает %02d в этом выводе printf("%02d:%02d", h[p], m[p]) подскажите пожалуйста!
0 — ведущие нули, 2 — минимальная длина числа, d — квалификатор для int.
Спасибо, а то обычно использую cin/cout, иногда очень редко scanf/printf и о такой особенности, как ведущие 0 к сожалению не знал...
cout << setw(5) << setfill('0') << 42 << endl;Ну теперь то я по полной оснащен операциями с ведущими 0, спасибо!)
Вывести ответ на c++ очень просто следующей строкой:
printf("%02d:%02d", h[p], m[p]).
а разве это не в стиле С
А в стиле С++ как раз cout<>
upd почему такой ответ не заходит
cout << "0" << hour << ":" <<"0" << min << endl;Мне кажется, я сказал вывести на c++, а не в стиле с++.
Ну например на тесте
вывод будет таким:
а так можно
if(hour<10 && min<10) {cout << "0" << hour << ":" <<"0" << min << endl;
return 0;
} система почему-то пишет,что ответ 00:00,хотя в консоли 00:06
Можно и так, только тогда видимо нужно 4 случая рассмотреть.
Возникли проблемы с DIV2 B. Не могу понять в чем проблема и что я делаю не так...
У меня есть решение проходит только тесты из примеров http://pastebin.com/nf3Axmm0
Суть моего решения в том, что я просто смотрю на массив a и смотрю сколько элементов из него я могу встретить в b, то есть сколько задач у меня уже готово, если для какого то a[i] я не могу найти ни одной подходящей задачи из b то я увеличиваю ответ, потом просто вывожу ответ.
Подскажите пожалуйста, что я делаю не так?
такой тест:
1 1
5
1
ответ: 0
В третьем абзаце описывается возможность понижать элементы первого массива. Соответственно, 5 понижается до 1.
Спасибо, я понял, но скорее ваш тест должен выглядеть так
1 1
1
5
Вот тогда ответ 0, а у вас ответ 1.
да
I don't understand the solution of D . can anyone explain? what to do? why the last part of answer
(n-1)-lengfor?We will add some arcs to create prefect matching in graph
I think the equation came from these :
ans = 2*(n-1); // for adding the (u,i)and(i,u) edges
ans = ans — (cntWithI) ; // they were already given, so we do not need to delete them,
ans = ans+1 ; // the center must have a self loop according to problem description.
ans = ans + Others ; // delete all the extra edges;
ans = ans — leng ; // do not have to delete the matching edges
ans = ans+ (n-1) ; // add n-1 self loops
ans = ans-leng ; // 'leng' number of vertices do not need self loop;
Hope it helps somebody.
Не совсем понятен в задаче D момент с удалением вершины и инцидентных ребёр, с последующим запуском алгоритма Куна.
А именно, почему гарантируется что на подобном графе алгоритм Куна вернёт максимальное паросочетание? Ведь граф может быть отнюдь не двудольным.
Поправьте, пожалуйста, меня.
Нет, почему. В разборе написано, нужно что-то вроде раздвоить вершины: "если полагать в качестве левой доли степень исхода, а в качестве правой степень захода. Дуга из нашего графа (i, j) будет равна дуге (i, j) — где i в левой доле, а j — в правой."
In the problem D, said "The complexity is: O(n2 m) time." But n and m (2 ≤ n ≤ 500, 1 ≤ m ≤ 1000). Can you explain why this complexity wont TLE? thank you.
Yes. First, let's calculate number of operations: it is about 2 * 108. It is not so much. If you have good implementation of Kuhn, it would pass. Also, I know, that number of operation is much lower than 2 * 108.
Test case 4 for Problem D says N = 153, M = 392. But there are only 391 edges in the input file.
http://mirror.codeforces.com/contest/387/submission/5868021
Am I misunderstanding something? Thanks.
Testcase is valid.
What does n variable mean in C problem tutorial?
n is the length of the number from the input.
So, for 800101 we have a1 = 800, a2 = 10, a3 = 1, and n = 6. what value has i for this example, 1 or -1?
i equals to -1. I understood, that there is an small mistake: answer is k - i + 1
Sorry for so many questions, but I can't still understand how we count answer answer for 800101. here k equals 3, i equals -1 (as you said), then answer should be k — i + 1 = 3 — (-1) + 1 = 5 when answer here is 3.. What I didn't understand correctly?
Oh, it's my mistake. If there is no such index, index i should be equals to 1, yes.
Okey. Then I understand and I'll think about proof. Thank you! :)
In problem C, the definition of the array need[i] in the description does not match with the code provided. The actual definition of need[i] should be : need[i] — equals to 0 if we should remove number i from permutation p, and 1 if we shouldn't remove i from permutation p. Please correct me if I am wrong.
Yes, description does not match with the code provided. There are only ideas in editorial, so there are can be differences.
Problem C is really a challenge for me!!! Orz!!!
Who cares ?
Sorry, I misunderstood the problem. Now it's much easier.
Who cares ???
Seems you care. :D
For C question, the answer for "945" should be 2, right? Seems like author solution is giving 3. Am I missing something here? Editorial logic seems fine but author's solution seems unclear to me.