Первая задача на реализацию. Надо было пройтись циклом по строке и все согласные буквы скопировать в новую строку. После этого пробежаться по полученной строке и перед каждой буквой вывести ‘.’.
Вторая задача также чисто на реализацию. Ее можно было выполнить следующим образом. Если задано n, то надо было вывести 2 * n + 1 строк для узора. При этом для строки I (0 <= I <= N) – количество пробелов в начале строки будет равно 2 * N – i. Для строки с номером I от N + 1 до 2 * N количество пробелов равно (I - N) * 2.
Таким образом, узор формируется следующим образом: сначала выводим соответствующее количество пробелов для нужной строки, потом соответствующую последовательность цифр. Каждая строка в решении должна заканчивать переводом строки и не содержать лишних пробелов в конце.
Итак, в задаче требуется получить наиболее красивый номер и затратить как можно меньше денег для этого. Разобьем задачу на подзадачи и решим ее для каждой цифры в отдельности. Чтобы затратить наименьшее количество денег и сделать максимальное количество замен следует для каждой цифры С заменять в номере все цифры отличные от нее сначала по модулю 1, затем по модулю 2, затем по модулю 3 и т д по возрастанию модуля, в этом и только в этом случае набранная сумма будет наименьшей. Естественно, если произведено нужное количество замен K, то работу алгоритма стоит прекратить. Однако, чтобы получить лексикографически наименьшую строку K с цифрами С, то надо производить замены следующим образом. Пусть на данном шаге алгоритма мы хотим поменять все цифры, отличные от цифры С по модулю I, то есть в строке все цифры С + I и цифры С – I заменить на цифру С. В таком случае сначала стоит заменять все цифры С + I на С, и замены производить с начала строки. А после поменять все цифры С – I на C, и замены производить с конца строки. В этом случае Петя потратит наименьшее количество денег, и получит лексикографически наименьший номер.
После останется выбрать наилучший ответ из 10 строк. Таким образом, асимптотическая сложность алгоритма равна 10 * 10 * n.
Задача решается ленивой динамикой. Пусть z[n1][n2][2] – это количество способов расставить войска в легионе Цезаря. Параметры обозначают следующее, n1 – это пехотинцы, n2 – это всадники, третий параметр обозначает какие войска ставит Цезарь в начало шеренги. Переходы следующие: если Цезарь хочет поставить n1 оставшихся пехотинцев в шеренгу, то из состоянии z[n1][n2][0] можно перейти в состояние z[n1 – i][n2][1], где I такое что (0 <= I <= min(n1, k1)). Если же Цезарь хочет поставить всадников, то из состояние динамики z[n1][n2][1] переходим в состояние z[n1][n2 – i][0], где 0 <= I <= min(k2, n2).
Формально задачу можно поставить так. Нам задан неориентированный связный граф, надо ориентировать его дуги таким образом, чтобы получился сильно связный ориентированный граф. Известна следующая теорема (на теоретической базе которой написана задача), что такой граф допускает ориентацию к сильно связному орграфу тогда и только тогда, когда каждое ребро входит в какой либо цикл.
Чтобы это проверить, достаточно запустить обход в глубину из произвольной вершины и ориентировать ребра графа в направлении этого обхода. Получилась некоторая ориентация графа. Чтобы убедиться, что в исходном графе нет мостов, достаточно взять полученную ориентацию графа, поменять в ней направление дуг, и проверить, что сохраняется сильная связность. Это можно сделать вторым поиском в глубину. Если сильная связность сохраняется, то ответом на задачу будет ориентация, полученная при первом обходе в глубину.
I mean some further explanations...any hints to prove it?
You can prove it by induction.
1) If the graph has only one node, there are no edges and the result is true.
2) Otherwise, if every edge is in a cycle, then consider one cycle, put arrows on the cycle so that it's connected. For each chord in the cycle, put arrows in the direction you want, it doesn't matter. Now contract the graph: i.e. consider the new graph where the cycle is replaced by one new node. The contracted graph has every edge in a cycle, so by induction, it's possible to put directions on every edge.
Now for the converse, if there is an edge that is not part of any cycle: It means that this edge is a bridge. And if the bridge has one direction, then the graph can not be strongly connected.
run dfs and orient the edges in the direction of the dfs
well, now i know why this is wrong ..
"if there exists a vertex with only one edge .. this means that this edge is a bridge and we should return 0"
but i can't get the right Algorithm :/
вопрос снят
i didn't get the editorial of Task D. someone please explain the dp approach and how the states are changing????
My solution is bigger. But it should be easier to understand.
i took two 3D array hdp[a][b][c] and fdp[a][b][c] where in hdp array a=total number of men in the combination, b=total number of horsemen in that combination, c=number of consecutive horsemen at the end of the combination. The similar is denoted by fdp array with horsemen replaced by footmen.
Now lets see how a previous state can contribute to the next state. Suppose we know hdp[i][j][k]. Then one possibility may be that we can add a horsemen at the end of this combination if k<k1 and j<n1 and we will get a combination for hdp[i+1][j+1][k+1]. Another possibility, we can add a footmen here if i-j<n2 and this will contribute in fdp[i+1][i-j+1][1].
In the same way, you can find how fdp[i][j][k] can contribute to fdp[i+1][j+1][k+1] and hdp[i+1][i-j+1][1]
base cases are fdp[1][1][1]=1 and hdp[1][1][1]=1
the solution will be in the fdp[n1+n2][n2][] and hdp[n1+n2][n1][] part. you have to traverse k1+k2 times to find the ans.
could not understand problem D . Someone please explain it
It says: for n1 + n2 Troops , Number of beautiful ways in which there are footmen in the very left is sum( dp[n1][n2 — 1][0] + ... + dp[n1][n2 — min(k2,n2)][0] ) cuz there shouldn't be more than min(k1,n1) footmen in the left. same goes for horsemen.
In counting the number of beautiful arrangements, we take some beautiful arrangement and we consider the prefix p1p2... pi where p1, ..., pi are all of the same type and pi + 1 is of the opposite type. i ≤ k1 when they are all horsemen and i ≤ k2 when they are all footmen. If you delete this prefix, the remaining arrangement is still beautiful but starts with a soldier of the opposite type. DP[n1][n2][0] counts the number of beautiful arrangements that begin with horsemen and DP[n1][n2][1] counts the number of beautiful arrangements that begin with footmen. Observe that DP[n1][n2][0] = DP[n1 - 1][n2][1] + DP[n1 - 2][n2][1] + ... + DP[n1 - min(n1, k1)][n2][1] and DP[n1][n2][1] = DP[n1 - 1][n2][0] + DP[n1 - 2][n2][0] + ... + DP[n1 - min(n1, k1)][n2][0].
Can somebody provide the link to the Theorem stated in explanation of task E.
Task-D is solved in detail on page 6 https://noi.ph/training/weekly/week3.pdf
I can't thank you enough. You were really a great help. Thanks again.
D is one hell of a question.
I had a hard time understanding the solution to D. Thanks to guys at Discord and also link mentioned by cobbishere , I was able to reach two solutions. Have written a post about it here: https://naman.dev/caesars-legions-codeforces.html .
One of the solution goes as follows: Let us construct a 4D DP array where DP[i][j][k][l] refer to number of ways given i footmen, j horsemen, such that we can still add k footmen or l horsemen to the back of the sequence.
Now the transitions are as follows:
Base Case: When i = 0 and j = 0, clearly we can have only 1 sequence (an empty sequence !). So, DP[0][0][k][l] = 1.
Now there are 2 possible cases:
We add a footmen to the back. Clearly, this is possible only if i > 0 (we have atleast one footmen) and k > 0 (we can atleast add a footmen to the back (there is no suffix of present sequence with k1 footmen)). Thus we add DP[i — 1][j][k — 1][l] . Similarly, for horsemen, we add DP[i][j — 1][k][l — 1] to the answer if j > 0 and l >0.
Thanks !
For D, what I did was use 4D DP where dp[i][j][k][l] means number of ways of placing a footmen or horsemen depending on 'l'(l==0 means footmen & l==1 means horsemen), when we have already placed j footmen/horsemen depending on 'l' such that 'k' of them stand consecutively......
My submission : 66992305
Beautiful explanation of Problem-D: https://noi.ph/training/weekly/week3.pdf .
Thanks good editorial